【问题标题】:Cannot understand WCF error message, help needed无法理解 WCF 错误消息,需要帮助
【发布时间】:2010-10-17 09:38:17
【问题描述】:

我有一个简单的 Web 服务,允许应用程序查询我的 CMDB。我遇到问题的功能适用于较小的结果集,但在较大的结果集上失败,这表明 WCF 服务配置中的某些内容阻止了它成功。

我有一个简单的 WinForms 测试应用程序,其中包含对 Web 服务的服务引用和调用相关函数的单个函数。

较小的结果集返回 ~120KB 的 xml,失败的较大结果集约为 2MB。我尝试增加 maxReceivedMessageSize 和 maxStringContentLength 的大小但没有成功。

我错过了一些配置吗?如果这是问题所在,我会期待更详细的错误消息。

提前致谢,

尼克


返回的错误是:

System.ServiceModel.CommunicationException: The underlying connection was closed: The connection was closed unexpectedly. --->
System.Net.WebException: The underlying connection was closed: The connection was closed unexpectedly.
   at System.Net.HttpWebRequest.GetResponse()
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   --- End of inner exception stack trace ---

Server stack trace: 
   at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ClientReliableChannelBinder`1.RequestClientReliableChannelBinder`1.OnRequest(TRequestChannel channel, Message message, TimeSpan timeout, MaskingMode maskingMode)
   at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout, MaskingMode maskingMode)
   at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at TestRig.CmdbDataService.ICmdbDataService.GetMonitors(String client)
   at TestRig.CmdbDataService.CmdbDataServiceClient.GetMonitors(String client) in C:\Documents and Settings\nfoster\My Documents\Visual Studio Projects\Virtual Operations Manuals\Trunk\src\TestRig\Service References\CmdbDataService\Reference.vb:line 1480
   at TestRig.Form1.btnGetServers_Click(Object sender, EventArgs e) in C:\Apps\Virtual Operations Manuals\Trunk\src\TestRig\Form1.vb:line 8

应用程序中的调用函数是:

Private Sub btnGetMonitors_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetMonitors.Click
  txtResults.Text = String.Empty
  Dim proxy As CmdbDataService.CmdbDataServiceClient = Nothing
  Try
    proxy = New CmdbDataService.CmdbDataServiceClient("WSHttpBinding_ICmdbDataService")
    Dim monitors As TestRig.CmdbDataService.ConfigurationItems = proxy.GetMonitors(txtClientName.Text)
    proxy.Close()
    For Each monitor In monitors
      txtResults.Text &= monitor.Name & " (" & monitor.TypeName & ")" & vbCrLf
    Next
    txtResults.Text &= monitors.Count & " monitors returned"
  Catch ex As Exception
    If Not IsNothing(proxy) AndAlso proxy.State <> ServiceModel.CommunicationState.Closed Then proxy.Abort()
    txtResults.Text = ex.ToString
  Finally
    proxy = Nothing
  End Try
End Sub

在测试台端,app.config 包含以下 serviceModel:

  <system.serviceModel>
    <diagnostics>
      <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true"
        logMessagesAtTransportLevel="true" />
    </diagnostics>
    <behaviors />
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_Default" closeTimeout="00:05:00"
          openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:05:00"
          maxBufferPoolSize="104857600" maxReceivedMessageSize="104857600">
          <readerQuotas maxDepth="104857600" maxStringContentLength="104857600"
            maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600" />
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost/CmdbServices/DataService.svc/soap12"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_Default"
        contract="CmdbDataService.ICmdbDataService" name="WSHttpBinding_ICmdbDataService">
        <identity>
          <userPrincipalName value="MyMachine\ASPNET" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

在服务端,web.config 是:

  <system.serviceModel>
    <diagnostics performanceCounters="Default">
      <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true"
       logMessagesAtTransportLevel="true" />
    </diagnostics>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="MyCorp.Cmdb.Services.DataService.CmdbDataService">
        <endpoint address="soap12" binding="wsHttpBinding" contract="MyCorp.Cmdb.Services.DataService.ICmdbDataService" />
        <endpoint address="soap11" binding="basicHttpBinding" contract="MyCorp.Cmdb.Services.DataService.ICmdbDataService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

【问题讨论】:

  • 我会尝试增加超时值。

标签: wcf exception


【解决方案1】:

我的一位同事刚刚将我指向this blog post,其中真正的罪魁祸首是端点行为中的 maxItemsInObjectGraph 属性。

解决了这个问题,我一定是刚刚超过了默认阈值 65536 :D

很高兴看到错误消息为您指明了正确的方向:(

干杯....

另外:您可能会收到此错误,因为您的 Web 方法之一使用的类不是 [DataContract] 类。

【讨论】:

【解决方案2】:

尝试在客户端代码中添加这个捕获:

catch (CommunicationException commProblem)
{
   Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace);
   Console.Read();

 }

【讨论】:

    【解决方案3】:

    本博客介绍了如何设置跟踪侦听器和使用 svctraceviewer.exe。

    http://tbszone.com/post/2010/11/16/WCF-The-connection-was-closed-unexpectedly.aspx

    【讨论】:

      【解决方案4】:

      更新:好的,我看到你已经打开了跟踪。您查看过 WCF 跟踪吗?

      【讨论】:

      • 我查看了这些痕迹,但我发现它们真的很难解码,WCF 不是我的主要领域。异常列在那里,但细节与原始异常完全相同:(
      猜你喜欢
      • 1970-01-01
      • 2018-09-06
      • 2023-04-04
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多