WCF故障修复

时间:2014-01-10 22:20:08

标签: .net vb.net wcf

我对这个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>

2 个答案:

答案 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