【发布时间】:2020-07-12 09:27:31
【问题描述】:
所以我有以下情况。我的 WCF 中有一个方法,客户端将在其中发送请求,然后 WCF 服务将执行一些后台处理并调用外部 Web 服务方法,该方法将立即响应确认(在后台处理完成之前)。
我想到的方法是让我的 WCF 方法在生成一个线程进行后台处理后返回一个响应,并调用外部 web 服务。流程是这样的:
调用者向 INITIAL_CALL 发送请求
WCF 启动一个调用 PROCESS 的线程
WCF 返回真
PROCESS 调用 EXTERNALWS 并在 postResponse 中获得响应
postReponse 被记录到数据库中
参见下面的示例代码:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service : IService
public bool INITIAL_CALL()
{
new Thread(()=>
{
PROCESS();
}).Start();
return true;
}
private void PROCESS()
{
//Do some background processing and create request for call below
var processRequest = "Request goes here";
using (var client = new EXTERNALWS.ResponseTypeClient())
{
var postResponse = client.POST(processRequest);
//Log postResponse to database
}
}
考虑到 PROCESS() 可能会运行很长时间,我只是想看看是否有更好的方法使用 WCF 和 IIS 来执行此操作?或者,如果有任何我必须考虑的陷阱,即 IIS 应用程序池回收破坏线程。
【问题讨论】:
-
WCF 调用无法按您希望的方式工作。已经有大量关于您是否应该或如何在 WCF 中运行长时间运行的任务的帖子,stackoverflow.com/questions/11087826/… 但是,请记住,WCF 不是为此而设计的,SignalR 将是一个更好的选择。
-
我在这里看到了这个例子:social.msdn.microsoft.com/Forums/vstudio/en-US/… 这似乎描述了我想要实现的目标。我只是想知道是否有任何需要考虑的事项?您分享的帖子很笼统且含糊不清,似乎需要创建一个单独的应用程序来运行长时间运行的任务。另外,如何在上述流程中使用 SignalR?
-
我唯一要补充的是,您所说的线程没有描述您要实现的目标。
标签: wcf asynchronous iis application-pool