在大量数据上调试Web服务asmx silent失败

时间:2014-03-19 23:51:12

标签: web-services wcf debugging web-config

快速概述/问题:

我有一个.asmx Web服务,它从Windows服务中检索数据。较大的数据集不是从Windows服务返回到asmx服务。 如何找出原因?

进一步说明:

这一切都有效,直到我尝试将大量数据从Windows服务推送到Web服务。我在Windows服务中发送消息,显示总是有记录被推回。大数据计数永远不会进入.asmx,没有任何可见的错误被抛出,导致Web服务等待并最终超时 - 我将超时推送到5分钟,但没有区别。 现在我认为它达到了某种限制,因为2000条记录在几秒钟内就会恢复,4000条记录在5分钟后就不会恢复。

为了记录,我意识到这种架构并不理想,但这对我来说更像是一次学习练习,我想学习如何诊断确切的问题。看到实际的错误/原因。我相信在现实世界中我可以直接与.ajax调用的WCF Windows服务对话。但我似乎越来越多地使用WCF,并希望学习更好地诊断问题的技能。

我已经碰到了一堆缓冲区和时间,请参阅下面的配置。我想我错过了一个?

html客户端web.config

<system.web>
  <httpRuntime executionTimeout="999999" maxRequestLength="2097151" />  
...
<bindings>
  <wsDualHttpBinding>
    <binding name="WSDualHttpBinding_IPointDataServiceContract" maxBufferPoolSize="0" maxReceivedMessageSize="2147483647" receiveTimeout="00:05:00" sendTimeout="00:05:00" openTimeout="00:05:00" closeTimeout="00:05:00" >
        <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
    </binding>
  </wsDualHttpBinding>
</bindings>

 <client>
  <endpoint address="http://localhost:8732/Design_Time_Addresses/PointDataService/" binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPointDataServiceContract" contract="PointDataServiceProxy.IPointDataServiceContract" name="WSDualHttpBinding_IPointDataServiceContract">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
</client>

<behaviors>
  <endpointBehaviors>
    <behavior name="PointDataServiceProxy">
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
  </endpointBehaviors>
</behaviors>

<system.web.extensions>
<scripting>
  <webServices>
    <jsonSerialization maxJsonLength="2147483647" />
  </webServices>
</scripting>

WCF windows service.exe.config

<system.serviceModel>
<services>
  <service behaviorConfiguration="Namespace.PointDataWcfService"
           name="Namespace.PointDataWcfLibrary.ServiceImplementation.PointDataService">
    <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="" contract="Namespace.PointDataWcfLibrary.ServiceContracts.IPointDataServiceContract">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8732/Design_Time_Addresses/Namespace/PointDataService/" />
      </baseAddresses>
    </host>
  </service>
</services>

<bindings>
  <wsDualHttpBinding>
    <!--name="WSDualHttpBinding_IPointDataServiceContract"
      note since multiple endpoints have dualHttp, we will not specify binding name so both point to the same node-->
    <binding maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" receiveTimeout="00:05:00" sendTimeout="00:05:00" openTimeout="00:05:00" closeTimeout="00:05:00">
        <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
    </binding>
  </wsDualHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>
    <behavior name="Namespace.PointDataWcfService" >
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="True"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="True" />
    </behavior>
  </serviceBehaviors>
</behaviors>

1 个答案:

答案 0 :(得分:0)

好的 - 解决了,我会把它留在这里以防它帮助其他人 - 我昨天花了一天时间。关键是开启跟踪 - 我之前尝试过这个并且无法生成日志文件,但这种语法有效。

我在web.config中使用此块启用了跟踪。我把它放入web服务配置,也进入windows服务配置 - 更改每个日志的文件名。注意我还给了'每个人'完全许可它写的文件夹。

<configuration>
<system.diagnostics>
    <trace autoflush="true">
        <listeners>
        </listeners>
    </trace>
    <sources>
        <source name="System.ServiceModel"
                switchValue="Information, ActivityTracing"
                propagateActivity="true">
            <listeners>
                <add name="sdt"
                     type="System.Diagnostics.XmlWriterTraceListener"
                     initializeData= "c:\inetpub\wwwroot\MyWebSite\WcfDetailTrace.svclog" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

这给了我一个svc日志文件,我可以使用已经安装的Service Trace Viewer Tool (SvcTraceViewer.exe)打开。首先,客户端没有显示任何明显的东西,但服务器有一个红色突出显示错误 - 非常容易发现!错误告诉我,我没有为行为声明maxItemsInObjectGraph。当然,我在“行为”部分中遗漏了以下内容。

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

现在返回了数据,我在客户端遇到了同样的错误,我可以在我的ajax调用中捕获。原来我的第二个错误是我在客户端上声明了行为,但是我没有从我的端点引用它(behaviorConfiguration =“PointDataServiceProxy”)。

希望这可以帮助别人(或者当我忘记并回到这里时帮助我!) - 当你看到错误时很容易:)。