none
WCF 客户端报报出异常,操作超时,请各位大神帮忙解答 RRS feed

  • 问题

  • 2017-11-22 09:37:40.992__ 发送到 net.tcp://localhost:2004/ScheduleService/ 的请求操作在配置的超时(00:01:00)内未收到回复。分配给此操作的时间可能已经是更长超时的一部分。这可能由于服务仍在处理操作或服务无法发送回复消息。请考虑增加操作超时(将通道/代理转换为 IContextChannel 并设置 OperationTimeout 属性)并确保服务能够连接到客户端。

    Server stack trace:
    在 System.ServiceModel.Dispatcher.DuplexChannelBinder.SyncDuplexRequest.WaitForReply(TimeSpan timeout)
    在 System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(Message message, TimeSpan timeout)
    在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
    在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
    在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

    Exception rethrown at [0]:
    在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
    在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
    在 Automation.ScheduleService.IScheduleService.CheckCarrierId(String carrierid)
    在 Automation.ScheduleService.ScheduleServiceClient.CheckCarrierId(String carrierid) 位置 c:\Users\SCH\Desktop\Automation\Automation\Service References\ScheduleService\Reference.cs:行号 581
    在 Automation.Form1.S3F17_CarrierCMD(Int32 ulSystemBytes, Object RawData) 位置 c:\Users\SCH\Desktop\Automation\Automation\Form1.cs:行号 2149

     WCF Server 端配置
     <services>
      <service name="Schedule.WCFInterface.ScheduleService">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="netTcpBindConfig" contract="Schedule.WCFInterface.IScheduleService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="net.tcp://localhost:2014/ScheduleService/" binding="mexTcpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:2004/ScheduleService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <netTcpBinding>
        <binding name="netTcpBindConfig" closeTimeout="00:30:00" openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" portSharingEnabled="true" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <reliableSession enabled="true" inactivityTimeout="00:02:00" />
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>
    
        客户端配置
         <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBinding_IScheduleService">
          <reliableSession inactivityTimeout="00:02:00" enabled="true" />
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>
    <client>
      <endpoint address="net.tcp://localhost:2004/ScheduleService/"
        binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IScheduleService"
        contract="ScheduleService.IScheduleService" name="NetTcpBinding_IScheduleService">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
    
    2017年11月23日 7:47

全部回复

  • Hi WD_2007,

    从错误信息来看,我建议你参照下面的代码设置 OperationTimeout.

                ChannelFactory<IService1> channel = new ChannelFactory<IService1>(binding, address);
                IService1 client = channel.CreateChannel();
                ((IContextChannel)client).OperationTimeout = new TimeSpan(0, 30, 0);
    

    对于TimeOut的异常,我建议你在客户端和服务端增加sendTimeout and receiveTimeout

    为了查看更详细的错误信息,我建议你在客户端和服务端都使用WCF Tracing,然后将日志分享给我们看下。

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年11月24日 2:41
    版主
  • 谢谢您的回复;

    1. 目前默认的客户端OperationTimeout可能是1分钟,我看报错是1分钟超时,不知道我理解的对不对;

    2. 如果没有物理上的通信异常,例如网线的断开,因为我们的两个程序在一台电脑上,我们的程序比较苛刻(写的比较傻)不允许这么长的时间(1分钟)的断开容错;

    3. 您说的WCF Tracing在哪里设置呢?因为WCF没有多久经验,这个还不是很清楚,实在不好意思;

    4. 另外,您能给我讲解下,都有哪些情况会发生上述问题吗?我可以先在trace同时,进行排查;

    再次表示感谢!

    • 已标记为答案 WD_2007 2017年11月24日 5:48
    • 取消答案标记 WD_2007 2017年11月24日 5:48
    2017年11月24日 5:48
  • Hi,

    设置OperationTimeout之后,问题解决了么?

    对于WCF Tracing,你可以参照下面的连接一步步操作(因为没有找到中文文档,你可以需要翻译工具翻译一下)

    # Configuring Tracing

    https://docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/tracing/configuring-tracing

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月27日 5:23
    版主
  • 谢谢您的回复,

    1. 因为我们的软件应用环境不允许超时超过1分钟,因此没有对OperationTimeout进行设置

    2. 我们增加了一些log,但是我们的WCF服务调用非常频繁,log特别大,因此先在自己的仿真环境下进行了仿真测试,目前还没有抓到这个异常;

    3.另外我们拿掉了reliableSession enabled="true" inactivityTimeout="00:02:00" />,不知道有没有改善,因为增加了这个之前没有报错这么频繁

    2017年11月27日 9:14
  • Hi

    你能具体说说“软件应用环境不允许超时超过1分钟”?你是指请求发出到接受Response不能超出1分钟?

    OperationTimeout是设置一个操作在这个时间内必须完成,否则就会抛出异常。

    在用WCF Tracing你可以只记录Error,并且查看日志的时候也只看具体的Error

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月28日 6:27
    版主
  • 1. 就是您说的,请求发出到接受不能超出1分钟

    2.这是我接收到的异常log
    <EventID>131075</EventID>
    <Type>3</Type>
    <SubType Name="Error">0</SubType>
    <Level>2</Level>
    <TimeCreated SystemTime="2017-12-01T00:17:19.8819794Z" />
    <Source Name="System.ServiceModel" />
    <Correlation ActivityID="{45f4abdf-8f2b-44c5-a81f-04541362be34}" />
    <Execution ProcessName="WebDev.WebServer40" ProcessID="6132" ThreadID="26" />
    <Channel />
    <Computer>PLUS-PC</Computer>
    </System>
    <ApplicationData>
    <TraceData>
    <DataItem>
    <TraceRecord xmlns="" Severity="Error">
    <TraceIdentifier>http://msdn.microsoft.com/zh-CN/library/System.ServiceModel.Diagnostics.ThrowingException.aspx</TraceIdentifier>
    <Description>正在引发异常。</Description>
    <AppDomain>4023a839-1-131565021676136782</AppDomain>
    <Exception>
    <ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
    <Message>服务器未提供有意义的回复;这可能是由协定不匹配、会话过早关闭或内部服务器错误引起的。</Message>
    <StackTrace>
    在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
    在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
    在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
    在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp; msgData, Int32 type)
    在 Schedule.CMP1.ICMPService.GetData(List`1 svlist)
    在 Schedule.CMP1.CMPServiceClient.GetData(List`1 svlist)
    在 Schedule.Models.Cmp1Service.GetData(List`1 svlist)
    在 Schedule.Models.Refresh.UpdateCMP1SVIDData()
    在 Schedule.Models.Refresh.UpdateCMPList()
    在 Schedule.Models.MainPage.MonitorCMPUi()
    在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    在 System.Threading.ThreadHelper.ThreadStart()
    </StackTrace>
    <ExceptionString>System.ServiceModel.CommunicationException: 服务器未提供有意义的回复;这可能是由协定不匹配、会话过早关闭或内部服务器错误引起的。</ExceptionString>
    </Exception>
    </TraceRecord>
    </DataItem>
    </TraceData>
    </ApplicationData>
    </E2ETraceEvent>

    2017年12月2日 2:29
  • Hi WD_2007,

    WCF 服务端方法执行会花费多长时间?如果,你添加一个新的方法,只返回一个简单的字符串,还会出现这样的错误?

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月4日 1:50
    版主
  • 正常情况下,服务端每个方法执行基本不会花时间,当时就能完成;

    这个错误是偶尔出现的,出现频率比较低,因此才不容易找出错误

    2017年12月5日 3:23
  • 找不到问题出现的原因,是比较难解决问题的。

    对于客户端出现这样的情况,我建议使用Try Catch block,当发生异常后,再创建一个Channel去请求服务端的Service。

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 Tony---- 2017年12月8日 8:25
    2017年12月6日 2:35
    版主
  • 好的,谢谢您的帮助
    2017年12月8日 5:41
  • Hi 您好,最近我们又出现了上述问题,这次抓了以下log, 您能帮我们分析下吗?链接: https://pan.baidu.com/s/1kVTK0iN密码: 73j6 ;另外,我们是同一个线程在调用不同服务,如果连着两个服务几乎同时调用就会频繁有这个问题,另外去掉Reliable就不会发生这个问题

    2018年2月7日 9:14