长时间运行处理WCF [OperationContract(IsOneWay = true)]

时间:2012-12-17 17:51:00

标签: c# wcf asynchronous-wcf-call

我遵循定义为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?

感谢您的提示。

4 个答案:

答案 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;
        }