我遵循定义为OneWay的服务,因为它长时间运行(几分钟),我不能等待它完成(它在ASP.NET应用程序中使用)。
问题在于,如果我在服务调用后调用client.Dispose(),它会阻塞并在60秒后超时到期,但异常。
如何在这种情况下处置客户端?增加服务的超时不是解决方案,因为我不能等待网页的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?
感谢您的提示。
答案 0 :(得分:3)
我会将您的绑定切换为netMsmqBinding。然后从您的客户端,您的单向呼叫将是即时的。
通过http发送的长持续时间最好是有问题且管理起来很复杂。在两者之间粘贴队列将极大地简化此操作。
答案 1 :(得分:2)
从您的签名中,您似乎不需要任何回应。在这种情况下,在服务上,当您收到BeginRun()
调用时,请在非WCF线程上执行工作。这将释放频道&应该允许你立即处置客户。
即使您已将OperationContract
标记为IsOneWay
,但这并不意味着WCF会立即释放该频道。在从线路读取所有数据之前,WCF服务实际上不会从单向调用返回。根据您的服务配置,这可能涉及等待以前的调用完成(特别是单一并发模式会话服务配置)。
因此,由于多种原因,在WCF线程的单独线程上实际执行服务工作通常是个好主意,这应该可以提高吞吐量。有关其他详细信息,请查看MSDN上的this article。
答案 2 :(得分:0)
您可以尝试使用IChannel方法。或者尝试这个,不确定这是否有效:http://msdn.microsoft.com/en-us/library/ms731177.aspx
答案 3 :(得分:0)
您需要在代码中添加try catch块,如果存在超时异常,则应该中止客户端。
try
{
work(client);
client.Close();
}
catch (Exception e)
{
client.Abort();
throw;
}