WCF跟踪.我如何得到关闭连接的确切原因?

rem*_*rem 11 connection wcf trace web-services

在我的WCF服务中,当尝试传输大数据时,我经常遇到错误:底层连接已关闭:连接意外关闭

我想知道是什么原因调用此错误,因此我设置了WCF跟踪并可以读取traces.svclog文件.

问题是,我可以在这个文件中看到很多关于进程流的信息,我可以看到出现异常的确切时间,但我看不出确切的原因.是由于MaxReceivedMessageSize还是类似的东西.

是这样trace.svclog不能包含这样的信息或我做错了什么?

如何获得这些信息?

编辑(补充):

从我的服务器端app.config:

    <system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="NAVBinding_ICustomer_Service"
                closeTimeout="01:50:00"
                openTimeout="01:50:00" receiveTimeout="01:50:00" sendTimeout="01:50:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
                maxReceivedMessageSize="2147483647" messageEncoding="Text"
                textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
                <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                    maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <services>
        <service name = "Customer_Service"  behaviorConfiguration="returnFaults">
            <endpoint name="NAVBinding_ICustomer_Service"
               address  = "http://localhost:8000/nav/customer"
               binding  = "basicHttpBinding"
               bindingConfiguration= "NAVBinding_ICustomer_Service"
               contract = "NAVServiceReference.ICustomer_Service"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="returnFaults" >
                <serviceDebug includeExceptionDetailInFaults="true" />
                <serviceMetadata httpGetEnabled="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
 </system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

编辑(补充):

什么是将WCF服务从"黑匣子"转变为易于故障排除的服务的正确和最佳方式,它告诉了为什么某些事情不符合预期的方式?您使用哪些工具,技术来解决WCF服务问题?

And*_*son 27

忽略maxRequestLength的问题(已被其他人回答),我将回答你关于如何解决WCF问题的原始问题.

如果您已经在使用服务跟踪查看器(我无法从问题中判断您是否只是手动查看它们) - 可能所有细节都没有进入文件.

当我想获得真正的硬核时,我启用了消息记录的所有日志记录参数.(这会产生一些大的服务日志,所以不要留下它)

 <system.serviceModel>
  <diagnostics>
   <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="-1" />
  </diagnostics>
 </system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

如果您不使用Microsoft服务跟踪查看器,我建议您这样做.它提供了我需要的所有信息,以追踪那些棘手的消息握手,消息大小异常等.这是一个MSDN参考,以帮助您入门 http://msdn.microsoft.com/en-us/library/aa751795.aspx

具有潜在问题的跟踪交互在左侧以黄色显示为高亮显示,右上方的详细窗格通常以红色显示特殊服务事件.有时,当内部错误通过服务堆栈级联时,您将遇到多个问题 - 但您可以在跟踪查看器中看到它.

使用服务跟踪查看器进

如果您的服务器"服务日志"中没有任何内容,那么您的异常可能完全在客户端 - 理论上,在任何消息实际到达Web服务之前,您可能会超出一些客户端安全参数(消息大小等)结束 - 但客户端问题通常更容易追踪,因为您知道您只需要担心在客户端编辑配置文件(即,这不是因为客户端和服务器设置之间的任何交互).


Ken*_*erg 8

我花了最近2天的时间试图找到为什么我得到"底层连接已关闭:连接意外关闭",方法调用返回时有更多数据与没有那么多数据时(即,它工作正常)只返回较小的数据集).

我的错误消息略有不同(可能是由于框架差异),但想分享我找到的原因.首先,我想说的是,虽然跟踪并增加上面给出的答案中配置文件中某些内容的大小可能有助于跟踪WCF错误,但这些事情并没有帮助我确定错误的真正原因.

通过查看抛出的异常链,我可以看到以下根,错误:"现有连接被远程主机强行关闭" - 这是一个System.Net.Sockets.SocketException

然后上调呼叫链:"无法从传输连接读取数据:远程主机强行关闭现有连接." - 然后是System.IO.IOException

"基础连接已关闭:接收时发生意外错误." - 一个System.Net.WebException,最后是什么是捕获的异常消息,

"收到HTTP响应时发生错误.这可能是由于服务端点绑定不使用HTTP协议.这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭) .有关详细信息,请参阅服务器日志." - System.ServiceModel.CommunicationException

启用跟踪然后使用TraceViewer查看跟踪日志确实使这更容易看到,但从未告诉我我的"现有连接被远程主机强行关闭"错误的真正原因.

就我而言,我的WCF服务托管在IIS6上,只有当我联系负责这些服务器的机构支持并要求他们查看系统事件日志时,我才立即看到答案 - 一个System.OutOfMemoryException!

我的WCF服务在分配的200MB RAM中运行,我的方法消耗的比这个多.我查看了我的方法,最终发现了一块代码块应该在它所在的块(循环)之外/之下...所以我在我的方法中生成了一个指数类型的集合.

希望这可以帮助别人.