![](/img/trans.png)
[英]WCF wrapper for 3rd party web service - fire and forget [OperationContract(IsOneWay = true)]
[英]Disposing WCF with long running [OperationContract(IsOneWay = true)]
我正在跟踪被定义为OneWay的服务,因为它运行时间很长(几分钟),并且我迫不及待地想知道它的完成时间(在ASP.NET应用程序中使用了它)。
问题是,如果我在服务调用之后调用client.Dispose(),它将阻塞,并且60s超时将异常终止。
在这种情况下我应该如何处置客户? 增加服务的超时时间不是解决方案,因为我迫不及待要使用网页的HTTP请求这么长时间。
[ServiceContract]
public interface IMyService
{
[OperationContract(IsOneWay = true)]
void BeginRun();
}
var client = new MyServiceClient();
client.BeginRun();
client.Close(); //This leads to time-out, how and when to call it?
感谢您的提示。
我将您的绑定切换为netMsmqBinding 。 然后,您的客户将立即发出单向呼叫。
通过HTTP进行长时间发送充其量是有问题的,并且管理起来很复杂。 将队列置于两者之间将大大简化此操作。
从您的签名看来,您不需要任何回应。 在这种情况下,在服务上,当您收到BeginRun()
调用时,请在非WCF线程上执行工作。 这将释放频道并应允许您立即处置客户端。
即使您将OperationContract
标记为IsOneWay
,也不意味着WCF立即释放该通道。 WCF服务实际上不会从单向调用中返回,直到从有线读取了所有数据为止。 根据您的服务配置,这可能涉及等待先前的调用完成(尤其是带有单并发模式的会话式服务配置)。
因此,出于多种原因,通常最好在与WCF线程不同的线程上实际执行服务工作,这将提高吞吐量。 有关其他详细信息,请参阅MSDN上的这篇文章 。
您可以尝试IChannel方法。 或者,也许尝试此操作,不确定是否可以正常使用: http : //msdn.microsoft.com/zh-cn/library/ms731177.aspx
您需要在代码中添加try catch块,如果存在超时异常,它将中止客户端。
try
{
work(client);
client.Close();
}
catch (Exception e)
{
client.Abort();
throw;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.