none
Wcf Timeout RRS feed

  • 问题

  • 我用silverlight做了一个聊天程序,原来在2.0上,  用
     PollingDuplexBindingElement pdbe = new PollingDuplexBindingElement();
       
       pdbe.ServerPollTimeout = TimeSpan.FromDays(5);
       pdbe.InactivityTimeout = TimeSpan.FromDays(5);
    就不会出现超时问题,但转到3.0后,用web.config来配置这个service后,只要10分钟不操作,就会出现超时,提示错误为“无法将通信对象 System.ServiceModel.Channels.ServiceChannel 用于通信,因为它已经被中止。”,不如应该如何设置。
    我是这样设置的。<binding name="pollingDuplexHttpBinding" receiveTimeout="23:59:59" sendTimeout="23:59:59" inactivityTimeout="23:59:59" ServerPollTimeout="23:59:59">
    后面几个timout的值,加不加都没有任何变化,请知情者帮助解决之。
    2009年8月20日 9:00

答案

  • 你好,
    要用pollingDuplexHttpBinding的话不是要设置customBinding. 我这里有个配置的例子:

     

     

     

     <system.serviceModel>
      <bindings>
       <pollingDuplexHttpBinding>
        <binding name="b1" inactivityTimeout="0:0:30">
        </binding>
       </pollingDuplexHttpBinding>
      </bindings>
      <behaviors>
       <serviceBehaviors>
        <behavior name="Pooling.Web.Service1Behavior">
         <serviceMetadata httpGetEnabled="true"/>
         <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
       </serviceBehaviors>
      </behaviors>
      <services>
       <service behaviorConfiguration="Pooling.Web.Service1Behavior" name="Pooling.Web.Service1">
        <endpoint bindingConfiguration="b1" address="" binding="pollingDuplexHttpBinding" contract="Pooling.Web.IService1">
         <identity>
          <dns value="localhost"/>
         </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
       </service>
      </services>
      <extensions>
       <bindingExtensions>
        <add name="pollingDuplexHttpBinding" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement, System.ServiceModel.PollingDuplex, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
       </bindingExtensions>
      </extensions>
     </system.serviceModel>


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Need a sample of a technique of Microsoft? Just check out CodeFx first! http://cfx.codeplex.com/

     


    2009年8月24日 5:44
    版主

全部回复

  • 附相关web.config 
    <system.serviceModel>
      <!-- Register binding extension from SDK. -->
     <!--<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />-->
      <extensions>
       <bindingExtensions>
        <add name="pollingDuplexHttpBinding"
       type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement, System.ServiceModel.PollingDuplex, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
       </bindingExtensions>
      </extensions>

      <!-- Create the polling duplex binding.  就是这串设置好像根本就没有任何作用,不知为什么-->
      <bindings>
       <customBinding>
        <binding name="pollingDuplexHttpBinding" closeTimeout="23:59:59" receiveTimeout="23:59:59" sendTimeout="23:59:59">
         <reliableSession inactivityTimeout="0:0:5" />
         <binaryMessageEncoding />
         <httpTransport />
        </binding>
     
       </customBinding>
      </bindings>

      <services>
       <service behaviorConfiguration="YPM.Core.YPMChatServiceBehavior" name="YPM.Core.YPMChatService">
        <endpoint address="" binding="pollingDuplexHttpBinding" contract="YPM.I.IYPMChatService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
       </service>
        </services>

      <behaviors>
       <serviceBehaviors>
        <behavior name="YPM.Core.YPMChatServiceBehavior">
       <serviceTimeouts transactionTimeout="23:59:59"/>
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
       </serviceBehaviors>
      </behaviors>

     </system.serviceModel>

    2009年8月20日 10:05
  • Hi,
       这个问题很多人遇到过。
      就是服务通道长久不使用的话,再次调用就会出错。显示通道状态处于Faulted。
      因为 inactivityTimeout="0:0:5" 。
      这个就是两次调用活动的时间间隔。
      你把它修改大点 inactivityTimeout="10:10:0"。
      这个默认的是10分钟。

      你现在修改完毕以后就不会出错了。现在间隔时间可以增加到10小时10分钟。

     你尝试一下~ 
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年8月20日 10:10
    版主
  • Hi, 这个问题很多人遇到过。 就是服务通道长久不使用的话,再次调用就会出错。显示通道状态处于Faulted。 因为 inactivityTimeout="0:0:5" 。 这个就是两次调用活动的时间间隔。 你把它修改大点 inactivityTimeout="10:10:0"。 这个默认的是10分钟。 你现在修改完毕以后就不会出错了。现在间隔时间可以增加到10小时10分钟。 你尝试一下~
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年8月20日 10:11
    版主
  • 谢谢Frank的回复,但是我的问题是,这个配置根本就没有起作用,我把它改为0:0:5,它依然是10分钟之后就不行了,改为23:59:59,问题还是一样,不知是不是还有别处有配置。并且,name="pollingDuplexHttpBinding" 这句,这个pollingDuplexHttpBinding改为任何名字,结果一样,没有任何变化,都是过10分钟就过期,提示“无法将通信对象 System.ServiceModel.Channels.ServiceChannel 用于通信,因为它已经被中止"

     <!-- Create the polling duplex binding.  就是这串设置好像根本就没有任何作用,不知为什么-->
      <bindings>
       <customBinding>
        <binding name="pollingDuplexHttpBinding" closeTimeout="23:59:59" receiveTimeout="23:59:59" sendTimeout="23:59:59">
         <reliableSession inactivityTimeout="0:0:5" />
         <binaryMessageEncoding />
         <httpTransport />
        </binding>
     
       </customBinding>
      </bindings>
    2009年8月21日 3:45
  • 不要客气。
      我重新查看了你的配置文件。
      你这个绑定的配置没错,之所以不起作用,是你的服务终结点绑定配置有错。
     <endpoint address="" binding="pollingDuplexHttpBinding" contract="YPM.I.IYPMChatService" />
     你修改一下:
     你把绑定配置名字放到绑定上去了。
    参考下面的代码修改:
      <endpoint address="" binding="customBinding" bindingConfiguration="pollingDuplexHttpBinding" contract="YPM.I.IYPMChatService">
        
       然后在测试一下,这次应该没问题了。
      还有就是inactivityTimeout="0:0:5" 一定要注意。
      你这个是5秒钟。服务闲置通道就出错的。


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年8月21日 4:55
    版主
  • 改了之后,直接输入服务地址,报错如下,还应该如何配置

    协定需要双工,但是绑定“CustomBinding”不支持它或者因配置不正确而无法支持它。

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.InvalidOperationException: 协定需要双工,但是绑定“CustomBinding”不支持它或者因配置不正确而无法支持它。

    源错误:

    执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

    2009年8月21日 6:39
  • Hi,
      这个说明是自定义绑定的问题。我没看到你的服务代码。
    你需要使用双工通信吗?
      你把这个绑定替换为WSDualHttpBinding以后再来做测试。
      非要自定义的话,就参考WSDualHttpBinding。
      或者使用NetTcpBinding.
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年8月21日 8:19
    版主
  • 我是用silverlight中写一个在线聊天程序,client A 在第一次登录时,server记住client A 的回回调方法,当有人给A发送消息时,由回调方法直接发送到 client A, 目前就是timeout的问题,若10分钟内没有操作,就timeout了,在silverlight 2.0中,用message1.0,反而没有问题,silverlight 好像不支持wsDualHttpBinding.,看来只能用以前的方法了
    2009年8月21日 9:18
  • Hi,
       你说的例子我看到过。
       MSDN也有。但是他们使用的绑定是netPeerTcpBinding。
      你参考一下:http://msdn.microsoft.com/zh-cn/library/bb690929.aspx
      
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年8月21日 9:35
    版主
  • 不妨看一下这个:
    http://tomasz.janczuk.org/2009/07/pubsub-sample-using-http-polling-duplex.html 

    此外,你这个程序里面还有其他的wcf服务没有,我发现polling duplex服务会使其他普通wcf服务无反应,silverlight.net上也有人反映同样的问题。
    2009年8月21日 11:57
  • 你好,
    要用pollingDuplexHttpBinding的话不是要设置customBinding. 我这里有个配置的例子:

     

     

     

     <system.serviceModel>
      <bindings>
       <pollingDuplexHttpBinding>
        <binding name="b1" inactivityTimeout="0:0:30">
        </binding>
       </pollingDuplexHttpBinding>
      </bindings>
      <behaviors>
       <serviceBehaviors>
        <behavior name="Pooling.Web.Service1Behavior">
         <serviceMetadata httpGetEnabled="true"/>
         <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
       </serviceBehaviors>
      </behaviors>
      <services>
       <service behaviorConfiguration="Pooling.Web.Service1Behavior" name="Pooling.Web.Service1">
        <endpoint bindingConfiguration="b1" address="" binding="pollingDuplexHttpBinding" contract="Pooling.Web.IService1">
         <identity>
          <dns value="localhost"/>
         </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
       </service>
      </services>
      <extensions>
       <bindingExtensions>
        <add name="pollingDuplexHttpBinding" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement, System.ServiceModel.PollingDuplex, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
       </bindingExtensions>
      </extensions>
     </system.serviceModel>


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Need a sample of a technique of Microsoft? Just check out CodeFx first! http://cfx.codeplex.com/

     


    2009年8月24日 5:44
    版主