2

我关注的是定义为 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

4 回答 4

3

我会将您的绑定切换到netMsmqBinding。然后,从您的客户那里,您的单向呼叫将是即时的。

通过 http 进行长时间发送充其量是有问题的,并且管理起来很复杂。在两者之间放置一个队列将大大简化此操作。

于 2012-12-18T08:38:43.637 回答
2

从你的签名来看,你似乎不需要任何回应。在这种情况下,在服务上,当您收到BeginRun()调用时,在非 WCF 线程上执行工作。这将释放通道并且应该允许您立即处理客户端。

即使您已将其标记OperationContractIsOneWay,这并不意味着 WCF 会立即释放该频道。在从线路中读取所有数据之前,WCF 服务实际上不会从单向调用返回。根据您的服务配置,这可能涉及等待之前的调用完成(尤其是单并发模式会话服务配置)。

因此,出于多种原因,在 WCF 线程之外的单独线程上实际执行服务工作通常是一个好主意,这应该会提高吞吐量。请查看MSDN上的这篇文章以获取更多详细信息。

于 2012-12-17T18:06:26.917 回答
0

您可以尝试 IChannel 方法。或者试试这个,不确定这是否可行:http: //msdn.microsoft.com/en-us/library/ms731177.aspx

于 2012-12-17T18:09:13.853 回答
0

您需要在代码中添加 try catch 块,如果出现超时异常,它应该中止客户端。

        try
        {
            work(client);
            client.Close();
        }

        catch (Exception e)
        {
            client.Abort();
            throw;
        }
于 2012-12-17T18:43:08.383 回答