繁体   English   中英

长时间运行会丢弃WCF [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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM