我正在运行由Windows服务托管的WCF服务(从asp.net站点调用)。
当我通过“BasicHttp”端点调用时超时(因为已超出 sendTimeout 属性),我得到预期的错误消息:
“请求频道在等待00:01:00之后的回复时超时....”
但是当通过NetTcp端点(使用传输安全性)进行调用时,我得到了更一般的错误:
“通信对象System.ServiceModel.Channels.ServiceChannel不能用于通信,因为它处于Faulted状态。”
有人知道为什么吗?我在配置中遗漏了什么吗?
我的客户端配置是:
<netTcpBinding>
<binding name="netTcpBindingConfig" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:00:10"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288" maxBufferSize="655360" maxConnections="10"
maxReceivedMessageSize="65536000">
<readerQuotas maxDepth="32" maxStringContentLength="65536000" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
<basicHttpBinding>
<binding name="basicHttpBindingConfig" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:00:00.500"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536000"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="65536000" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
</basicHttpBinding>
服务配置:
<basicHttpBinding>
<binding name="basicHttpBinding_config" maxReceivedMessageSize="5000000">
<readerQuotas maxDepth="9000000" maxStringContentLength="9000000"
maxArrayLength="9000000" maxBytesPerRead="9000000" maxNameTableCharCount="9000000" />
</binding>
</basicHttpBinding>
<netTcpBinding>
<binding name="tcpBinding_config" maxReceivedMessageSize="5000000" maxBufferSize="5000000" maxBufferPoolSize="5000000" >
<readerQuotas maxDepth="9000000" maxStringContentLength="9000000"
maxArrayLength="9000000" maxBytesPerRead="9000000" maxNameTableCharCount="9000000" />
</binding>
</netTcpBinding>
非常感谢任何帮助! 谢谢!
乔恩
答案 0 :(得分:2)
超时异常导致您的代理进入故障状态。
您没有使用BasicHttpBinding获取此异常的原因是因为此绑定不使用会话。如果使用会话的绑定存在异常,则通道将出现故障并且会话将被销毁。
这往往会隐藏问题的真正原因。调查原始异常的一种方法是使用WCF跟踪。
可以将WCF配置为跨应用程序的所有组件输出流程里程碑的跟踪,例如操作调用,代码异常,警告和其他重要的处理事件。
以下是启用跟踪的.config
示例。
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Warning" propagateActivity="true" >
<listeners>
<add name="xml"/>
</listeners>
</source>
<source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
<listeners>
<add name="xml"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="C:\logs\TraceLog.svclog" />
</sharedListeners>
</system.diagnostics>
</configuration>
确保您的服务可以写入initializeData
中定义的路径。您可以从MSDN: Configuring Tracing了解有关WCF跟踪的更多信息。
Microsoft提供Service Trace Viewer Tool来读取.svclog文件。