2011-06-09 101 views
4

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

我的问题是,领先供应商将只关闭连接并继续前进,最多只能等待30秒。我试图启动一个内部计时器,如果我没有收到第三方承销商的回复,请将回复发送给主要提供商。这一切工作正常。

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

我已经尝试了所有我已经得到了,这样做的

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

组合的种种是一个)抛出约线程错误被中止,或“无法因为代码是计算表达式优化的或本地框架位于调用堆栈之上“,或者b)客户端认为请求被终止并且它从未收到响应。

我不能实现一个队列类型的体系结构,而不需要重新编写大部分逻辑,即使这样我也不想这样做,因为它会增加响应的处理时间。

有什么建议吗?看起来.Close()和.End()并不意味着我认为它们是如何工作的,我不知道应该用什么来代替。

回答

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); 
} 
+0

我不知道这将如何帮助。我需要等第三方承销商的回应,至少有一段时间。但无论我做什么,我都无法让IIS实际返回响应,因为它现在已经写好了。它总是等到线程死亡。我不确定你的解决方案如何帮助我,但也许我错过了一些东西。 – 2011-06-09 19:36:29

+0

不确定要了解你的需要。你说过“我想要做的就是将回复发送给主要提供商,但要继续等待第三方承销商的回应。”你想对结果做什么? – 2011-06-09 19:39:16

+0

我会得到响应并将其存储在数据库中。但是如果我在另一个线程上启动另一个方法,我将如何收到响应?我已经有了一个HttpWebRequest对象......我不能只在线程的某个地方存储它,对吗? – 2011-06-09 19:48:12

相关问题