2012-07-03 25 views
0

我正在調用一個我之前製作的WCF服務,該服務查詢語義數據庫並返回dbpedia.org鏈接,這些鏈接都與實體名稱一樣例如,你會發現「http://dbpedia.org/resource/Barack_Obama」或「http://dbpedia.org/resource/Brazil」消費WCF服務時奇怪的異常(可能是字符編碼異常?)

我面臨的問題是,雖然調用返回的方法所提到的URI大多數情況下該方法正常工作,但很少發生此錯誤:

底層連接已關閉:預計將保持活動的連接已被服務器關閉。

Server stack trace: 
    at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ClientReliableChannelBinder`1.RequestClientReliableChannelBinder`1.OnRequest(TRequestChannel channel, Message message, TimeSpan timeout, MaskingMode maskingMode) 
    at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout, MaskingMode maskingMode) 
    at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at ComparisonServiceInterface.Compare(String[] URIs) 
    at ComparisonServiceInterfaceClient.Compare(String[] URIs) 

Inner Exception: 
The underlying connection was closed: A connection that was expected to be kept alive was closed by the server. 
    at System.Net.HttpWebRequest.GetResponse() 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 

Inner Exception: 
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. 
    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead) 

Inner Exception: 
An existing connection was forcibly closed by the remote host 
    at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 
    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 

我想,也許一些資源有不同的編碼,如「http://dbpedia.org/resource/Sergio_Agüero」爲可能的「U」字的東西?

我在發送之前嘗試對uri進行編碼,它仍會引發相同的異常。

服務配置文件看起來是這樣的:

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true"/> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="mergedServices.MergedService"> 
     <endpoint address="" binding="wsHttpBinding" contract="mergedServices.RelationGeneratorServiceInterface"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="" binding="wsHttpBinding" contract="mergedServices.keywordSearchServiceInterface"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="" binding="wsHttpBinding" contract="mergedServices.QAServiceInterface"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="" binding="wsHttpBinding" contract="mergedServices.CompareWithOnePredicateServiceInterface"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="" binding="wsHttpBinding" contract="mergedServices.ComparisonServiceInterface"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="" binding="wsHttpBinding" contract="mergedServices.ProfileConstructorInterface"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8732/Design_Time_Addresses/mergedServices/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- 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="False"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> 
+0

你是否在每個需求後關閉chanel? –

+0

目前還不清楚,如果問題在於,當您使用特殊字符(「http://dbpedia.org/resource/Sergio_Agüero」)時,您會收到此錯誤,或者您有時會得到此錯誤,並猜測它可能是特殊字符。 – tallseth

回答

0

暫時包括故障異常詳細信息,這將讓你得到真正的錯誤。此外,在向服務重新引入異常之前,您應該記錄異常,這樣您就可以知道真正的問題是什麼,而不會在故障中包含異常詳細信息。

<serviceDebug includeExceptionDetailInFaults="True"/> 
+0

服務器端沒有異常,運輸異常 – SKandeel