我使用了下面的服务,定义为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?谢谢你的建议。
发布于 2012-12-18 02:06:27
从你的签名来看,你似乎不需要任何形式的回复。在这种情况下,在服务上,当您收到BeginRun()调用时,在非WCF线程上执行工作。这将释放通道&应该允许您立即处理客户端。
尽管您已经将OperationContract标记为IsOneWay,但这并不意味着WCF会立即释放该通道。在从网络读取所有数据之前,WCF服务实际上不会从单向调用中返回。根据您的服务配置,这可能涉及等待之前的调用完成(特别是使用单并发模式会话服务配置)。
因此,出于几个原因,在独立于WCF线程的线程上实际执行服务工作通常是一个好主意,这将提高吞吐量。有关更多详细信息,请查看MSDN上的this article。
发布于 2012-12-18 16:38:44
我会将您的绑定切换到netMsmqBinding。然后,从您的客户端,您的单向呼叫将是即时的。
通过http的长持续时间发送充其量是有问题的,并且管理起来很复杂。在两者之间插入一个队列将极大地简化此操作。
发布于 2012-12-18 02:09:14
您可以尝试IChannel方法。或者试试这个,不确定它会不会起作用:http://msdn.microsoft.com/en-us/library/ms731177.aspx
https://stackoverflow.com/questions/13919364
复制相似问题