快速概述/问题:
我有一个.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>
答案 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”)。
希望这可以帮助别人(或者当我忘记并回到这里时帮助我!) - 当你看到错误时很容易:)。