我对这个WCF故障处理问题感到很沮丧。我现在已经研究了3天了,似乎没有更接近解决方案。
我在How to heal faulted WCF channels?和Disposing of WCF Clients找到了我认为的答案,但我无法在我的环境中使其发挥作用。我正在使用VB.NET 4.0并尝试与供应商的服务器进行通信。他们提供了wsdl和xsd文件,其中svcutil变成了我已经合并到我的程序中的代理类。
到目前为止,我已经成功地完成了安全性并实现了14个端点中的13个。这些似乎工作得很好。在实例化客户端时,不起作用的属性将返回 已创建 的State属性:
Dim Client = New InquireBillingInvoiceDetailsPortTypeClient(ConfigName, AppEndPoint)
If Client.State = CommunicationState.Opened Then
Client.Open()
' Code I'm not getting to
Else
Client.Abort()
Client = Nothing
End If
我理解通道可能有故障,但我不明白为什么在故障情况得到纠正后很难清除故障情况。
我也没有得到任何痕迹。客户端和服务器之间没有与此服务通信,就像其他端点一样。 svclog文件中是否应该有与此实例化相关的内容?这可能有点矫枉过正,但我也在这里包含了app.config文件的相关部分。任何帮助将不胜感激。
<basicHttpBinding>
<binding name="InquireBillingInvoiceDetailsSoapHttpBinding"
closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00"
sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
<client>
<endpoint address="https://.../InquireBillingInvoiceDetails.jws"
behaviorConfiguration="endPointCredentialBehavior"
binding="basicHttpBinding"
bindingConfiguration="InquireBillingInvoiceDetailsSoapHttpBinding"
contract="InquireBillingInvoiceDetailsPortType"
name="InquireBillingInvoiceDetailsSoapHttpPort" />
</client>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging"
switchValue="All" >
<listeners>
<add name="xml" />
</listeners>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="U:\logs\Traces.svclog" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
答案 0 :(得分:1)
CommunicationState.Created
不是一个错误。它只是“表示通信对象已经实例化并且是可配置的,但尚未打开或可以使用。”
在您提供的代码段中,您要检查CommunicationState
是否为Opening
(“表示通信对象正在从已创建状态转换为已打开状态”。 ),但您还没有发出Open()
命令,因此它仍处于Created
状态。这就是您的代码未达到Client.Open()
声明的原因。
尝试这样的事情:
Dim Client = New InquireBillingInvoiceDetailsPortTypeClient(ConfigName, AppEndPoint)
If Client.State = CommunicationState.Created Then
Client.Open()
Else
Client.Abort()
Client = Nothing
End If
有6个州(详情请注明 - CommunicationState Enumeration) - 封闭,关闭,创建,故障,开放,开放。
答案 1 :(得分:0)
完成的代码如下所示:
Dim Client = New InquireBillingInvoiceDetailsPortTypeClient(ConfigName, AppEndPoint)
Client.Open()
If Client.State = CommunicationState.Opened Then
' useful code
Else
Client.Abort()
Client = Nothing
End If