0

我们有一个长期运行的异步 WCF 服务操作,它从我们服务中的不同组件中获取日志文件。现在,一切正常,但我们还想实现一个“很高兴”的功能。

如果异步服务花费的时间太长,WCF 将超时,但如果我们的某个组件行为不端,则发出其日志文件的时间可能比我们为超时期限分配的时间长。如果发生这种情况,如果客户端应用程序告诉用户获取日志文件需要一段时间并询问用户是否要继续等待,那就太好了。如果用户说是,是否有某种方法可以在超时时的状态下恢复操作并重置超时计时器?

这个伪代码显示了我们的想法:

public void GetServiceLogFiles(Action<Object> callback)
{
    try
    {
        var gotLogFilesDelegate = (result) =>
            { var answer = WcfService.EndGetLogFiles(result);
              callback(answer); };
        WcfService.BeginGetLogFiles(gotLogFilesDelegate, null);
    }
    catch(TimeoutException)
    {
        var dialog = new Dialog("The service is taking a while to get the log files. Would you like to keep on waiting for it to finish?");
        if(dialog.response = Dialog.YES)
            Magic_happens_here_and_lets_the_Wcf_Service_continue_working_on_Get_Log_Files();
    }
}
4

1 回答 1

3

有一种方法可以设置超时值。看一下 System.ServiceModel.Channels.Binding,它具有以下属性:

ReceiveTimeout
OpenTimeout
SendTimeout
CloseTimeout

这些可以在创建服务代理时设置。

public static class MyWcfServiceProxyFactory
{
    public static MyWcfService CreateMyWcfService(string endpointUrl) 
    {

        EndpointAddress endpointAddress = new EndpointAddress(endpointUrl);
        CustomBinding customBinding = new CustomBinding();

        TimeSpan timeout = new TimeSpan(0, 5, 0);

        customBinding.ReceiveTimeout = timeout;
        customBinding.OpenTimeout = timeout;
        customBinding.SendTimeout = timeout;
        customBinding.CloseTimeout = timeout;

        ChannelFactory<MyWcfService> channelFactory = new ChannelFactory<MyWcfService>(customBinding, endpointAddress);

        return channelFactory.CreateChannel();
    }
}

如果在配置中创建绑定,则可以使用相同的设置。

<bindings>
    <basicHttpBinding>
        <binding name="MyWcfService"  
        receiveTimeout="0:05:00"
        openTimeout="0:05:00"
        sendTimeout="0:05:00"
        closeTimeout="0:05:00">

我不认为事后可以更改超时,因此您必须创建 2 个通道,一个具有“正常”超时,一个具有延长超时。如果正常一次超时,重试尝试可以使用延长超时的通道。

于 2012-07-18T00:36:37.810 回答