我有一个Web服务,它接收来自用户的请求并返回一些json。我需要将json字符串保存在数据库中,所以暂时,写入查询会在响应发送回来之前发生。
在响应离开Web服务后,有没有办法先发送响应然后再写查询?
感谢。
答案 0 :(得分:2)
这里有几个不同的选择 - 但它们都有权衡,而且会非常深奥。你没有提到为什么你想要这样做,所以我猜测性能。如果是这样的话,我认为你正在咆哮错误的树 - 一个简单的写法几乎肯定不是你的性能问题。
所以,脱离我的头脑:
@frenchie说:响应从数据库读取json字符串开始,最后写回来。换句话说,如果用户发送请求,那么将要读取的json字符串必须是在上一个响应中写入的字符串。
这使事情复杂化,因为异步工作中固有的不知道何时完成。如果在处理下一个请求之前需要执行异步部分(写回数据库),则必须执行等待以确保实际完成。为了做到这一点,你需要在客户端上保持服务器端状态 - 就服务而言,这不是最佳实践(尽管,听起来你已经在使用这些JSON请求/响应对)。
鉴于这些复杂情况,我会确保您完成了剖析并确定它确实是一个性能问题。
答案 1 :(得分:1)
您应该考虑使用MSMQ,ActiveMQ或RabbitMQ等消息队列来执行此操作。当您收到请求时,您会将相关数据放入队列,并将您的响应发送给客户端。在队列的另一端,您将拥有一些从队列中读取数据并将数据插入数据库的进程。
答案 2 :(得分:1)
您可以安排查询工作,如
ThreadPool.QueueUserWorkItem(state =>
this.AsynchronousExecuteReference());
// and run
static void AsynchronousExecuteReference()
{
// run here your sql update
}
另一个在类中使用Thread的示例,您可以将参数传递给它。
public class RunThreadProcess
{
// Some parametres
public int cProductID;
// my thread
private Thread t = null;
// start it
public Thread Start()
{
t = new Thread(new ThreadStart(this.work));
t.IsBackground = true;
t.SetApartmentState(ApartmentState.MTA);
t.Start();
return t;
}
// actually work
private void work()
{
// do thread work
all parametres are available here
}
}
以下是我如何运行它
var OneAction = new RunThreadProcess();
OneAction.cProductID = 100;
OneAction.Start();
不要担心内存,CG知道这个过程一直使用,直到线程结束,所以我检查它并且CG不删除它并等待线程结束。
答案 3 :(得分:0)
这是缺少请求/响应的要点。除非你想进入像服务总线这样的异步命令,但那是pub / sub,而不是请求/响应。请求/响应的目的是在收到请求之后和发送响应之前在服务器上完成工作。即使工作正在向服务总线发送异步消息。
答案 4 :(得分:0)
您可以尝试将您的网络服务网址移至生命周期所在的ASPX页面。
在代码隐藏中,调用执行Page_Load或Page_Prerender中主要部分工作的例程(或者在发送响应之前适当的时候),然后在Page_Unload事件中执行数据库工作。已发送回复(http://msdn.microsoft.com/en-us/library/ie/ms178472.aspx)。