【问题标题】:How can I set the receiveTimeout and sendTimeout to infinity with this WCF contact?如何使用此 WCF 联系人将 receiveTimeout 和 sendTimeout 设置为无穷大?
【发布时间】:2011-09-04 22:02:18
【问题描述】:

我的主机中有以下 app.config:

<services>
  <service name="DCC_Service.DCCService" behaviorConfiguration="serviceBehavior">
    <endpoint binding="netNamedPipeBinding" contract="DCC_Service.IDCCService" address="DCCService" />
    <endpoint binding="mexNamedPipeBinding" contract="IMetadataExchange" address="mex" />
    <host>
      <baseAddresses>
        <add baseAddress="net.pipe://localhost/"/>
      </baseAddresses>
    </host>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="serviceBehavior">
      <serviceMetadata httpGetEnabled="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

如何将 netNamedPipeBinding 超时设置为无限又名 Timespan.MaxValue

【问题讨论】:

    标签: wcf wcf-binding


    【解决方案1】:

    infinite 用于各种超时值 - 关闭、打开、接收和发送。您可以像这样在绑定配置中指定这些超时。

    <bindings>
        <netNamedPipeBinding>
            <binding name="mybinding" closeTimeout="infinite" openTimeout="infinite"
                receiveTimeout="infinite" sendTimeout="infinite" />
        </netNamedPipeBinding>
    </bindings>
    

    bindings 部分与servicesbehaviors 部分处于同一级别。唯一剩下的就是引用服务端点中的绑定配置。

    <services>
      <service name="DCC_Service.DCCService" behaviorConfiguration="serviceBehavior">
        <endpoint binding="netNamedPipeBinding"
            contract="DCC_Service.IDCCService"
            address="DCCService"
            bindingConfiguration="mybinding"/>         <!-- SEE THIS LINE -->
        <endpoint binding="mexNamedPipeBinding"
            contract="IMetadataExchange"
            address="mex" />
        <host>
          <baseAddresses>
            <add baseAddress="net.pipe://localhost/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <serviceMetadata httpGetEnabled="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    

    我不记得具体(而且我现在没有时间查看),但您可能还必须将这些东西放入您的客户端配置中。

    【讨论】:

    • 谢谢马特。我将以下内容添加到我的客户端:NetNamedPipeBinding binding = new NetNamedPipeBinding(); binding.SendTimeout = TimeSpan.MaxValue; binding.ReceiveTimeout = TimeSpan.MaxValue; 然后在实例化我的双工通道工厂时使用该绑定。
    • 我添加了 &lt;bindings&gt; ... &lt;/bindings&gt; 但 VS 在每个 "infinite" 值下划线为蓝色并带有无效的参数消息。例如The `openTimeout` attribute is invalid - The value `infinite` is invalid according to its datatype `String` - The Pattern constraint failed.
    • 我相信这是一个 Visual Studio 工件。在运行时使用时,“无限”字符串会被正确处理。在这里查看答案:social.msdn.microsoft.com/Forums/en-US/wcf/thread/…
    • 太棒了!但是,当我在client 中打开自动生成的 app.config 时,我仍然看到以下内容:&lt;binding name="NetNamedPipeBinding_IDCCService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" ... &gt; 更新服务参考时未设置超时?这些是否被我在客户端以编程方式设置的超时覆盖(见我的第一条评论)?
    • 我不相信这些配置设置在更新服务参考时会更新,因此您必须在客户端手动配置它们。我很确定您以编程方式使用的超时会覆盖配置文件中的默认设置。
    【解决方案2】:

    将其设置为最大时间跨度,即 10675199.02:48:05.4775807

    sendTimeout="10675199.02:48:05.4775807"
    

    【讨论】:

    • 我不得不使用它,因为“infinite”在配置中给出了警告:值“infinite”根据其数据类型无效:字符串。虽然你的处方是有限的,但当它最终超时时,我会死的很长时间,我的应用程序也是如此:)
    【解决方案3】:

    你也可以像下面这样给出最长的超时时间

    {

                binding.CloseTimeout = TimeSpan.MaxValue;
    
                binding.OpenTimeout = TimeSpan.MaxValue;
    
                binding.ReceiveTimeout = TimeSpan.MaxValue;
    
                binding.SendTimeout = TimeSpan.MaxValue;
    

    }

    【讨论】:

    • @Ricardo Pontual :除了添加空格之外,我还可以在答案中找到任何改进。这不是您改进答案的方式。删除了您的更改,
    • 你应该知道{ } 是代码的一部分,我已经编辑了代码块。确实这并不能改善问题,但格式良好的代码对所有开发人员来说都是一种好习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多