在向客户端返回响应后继续处理

时间:2011-06-09 19:30:16

标签: asp.net response

我有一个通用处理程序(.ashx)页面,它接收来自潜在客户提供程序的XML文档。然后,我将该XML文档发送给第三方进行承保。我等待第三方的回复,然后我将该回复传递给主要提供商。所有这些都发生在30秒或更短时间内。

我的问题是,在关闭连接并继续前进之前,潜在客户提供商只会等待最多30秒。我正在尝试启动一个内部计时器,如果我没有收到第三方承销商的回复,无论如何都要向主要提供商发送回复。一切正常。

我想要做的是将回复发送回主要提供商,但继续等待第三方承销商的回复。他们会把它交给我们......但有时可能需要几分钟。

我尝试过各种各样的

组合
Response.Flush();
Response.Close();
Response.End();
context.ApplicationInstance.CompleteRequest();

所有我要做的就是a)抛出一个关于线程被中止的错误,或者“无法评估表达式,因为代码已经优化或者本机框架位于调用堆栈之上。”或者b )客户认为请求刚刚终止,而且从未收到回复。

我无法在不重写大部分逻辑的情况下实现队列类型架构,即便如此我也不想这样做,因为它会增加响应的处理时间。

有什么建议吗?似乎.Close()和.End()并不意味着我认为它们的作用,我无法弄清楚应该使用什么。

1 个答案:

答案 0 :(得分:3)

也许System.Threading.ThreadPool.QueueUserWorkitem()可以帮到你?

这个想法是对线程池中线程空闲时运行的操作进行排队。

public class Data {
    public int ID {get; set; }
    public string OtherData { get; set; }    
}

public override void ProcessRequest(HttpContext context)
{
    var workLoad = new Data {
        ID = int.Parse(context.Request.Params["ID"]),
        OtherData = context.Request.Params["OtherData"]
    };
    // somewhere before the end :
    ThreadPool.QueueUserWorkItem(new WaitCallback(LongRunningMethod), workLoad);

    Response.Flush();
    Response.Close();
}

public void LongRunningMethod(object state) 
{
    var data = (Data)state;
    CalculateTheOriginOfTheLife(data.ID, data.OtherData);
}