2014-01-23 37 views
5

我正在嘗試開發一個Web應用程序,該應用程序使用WCF向Web服務提交簡單的登錄請求,但我一直在收到「內容類型文本/回覆消息不匹配」錯誤即使Web服務似乎正在返回有效的XML。以「text/plain」形式接收Web Service XML響應。 (還有另一種內容類型錯誤)

我回顧了幾十個相似的S.O.帖子關於這個錯誤,並已排除了比較常見的可能性:

  1. 我可以在響應看到它是不是一個錯誤頁面回來(如討論here)。
  2. 我似乎沒有約束力不匹配問題(如here所述)。我的應用程序和 Web服務都使用SOAP 1.1,並且我指定了「basicHttpBinding」。
  3. 包含在我的錯誤消息中的響應似乎顯示有效的XML ,其中包含我想要的用戶和響應變量。
  4. 我可以在Web服務日誌文件中看到登錄方法是 完全執行而不會引發異常。
  5. 我將XML響應粘貼到W3School驗證器中,但沒有發現 錯誤。

還有什麼可能導致我的錯誤,爲什麼不被認爲是有效的XML?

我正在爲我的應用程序使用.Net 4.0和Visual Studio 2010,該應用程序正在單獨的服務器上與Java/Tomcat Web服務進行通信。

下面是我的登錄代碼相關的摘錄:

AuthenticationServiceClient client = new AuthenticationServiceClient(strPortName, strURL); 
client.Open(); 
UserCredentials credentials = new UserCredentials(); 
credentials.userName = TestUsername; 
credentials.password = TestPassword; 
LoginResponse response = client.login(credentials); // Using WCF. 

這裏是綁定的樣子在我的web.config:

<system.serviceModel> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="AuthenticationServiceSoapBinding" /> 
    </basicHttpBinding> 
    </bindings> 
    <client> 
    <endpoint address="http://mywebserviceurl" 
     binding="basicHttpBinding" bindingConfiguration="AuthenticationServiceSoapBinding" 
     contract="MyNamespace.AuthenticationService" name="AuthenticationServiceImplPort" /> 
    </client> 
</system.serviceModel> 

這裏是我的錯誤留言:

在「WebServiceURL」測試與Web服務的連接時出錯:System.ServiceModel.ProtocolException:響應消息的內容類型text/plain與綁定的內容類型(text/xml;字符集= UTF-8)。如果使用自定義編碼器,請確保IsContentTypeSupported方法正確實施。第一788個字節的響應是: '

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
<loginReponse xmlns="urn:xxxx"> 
<authKey>xxxx</authKey> 
<authMetadata> 
<IPaddress>https://MyWebApplicationURL</IPaddress> 
<loginTimestamp>xxxx</loginTimestamp><levelOfAssurance> 
<AuthMechanism>xxxx</AuthMechanism> 
<VettingAssertion>xxxx</VettingAssertion> 
</levelOfAssurance> 
</authMetadata> 
<errorText></errorText> 
<successfulLoginFlag>true</successfulLoginFlag> 
<userSummary> 
<GUID>xxxx</GUID> 
<commonName>xxxx</commonName> 
<loginName>xxxx</loginName> 
</userSummary> 
<passwordExpiryDays>xxxx</passwordExpiryDays></loginReponse> 
</soap:Body> 
</soap:Envelope> 

'。

服務器堆棧跟蹤:在 System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest的 請求,響應HttpWebResponse,HttpChannelFactory工廠, 引發WebException responseException,ChannelBinding channelBinding)在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest .WaitForReply(TimeSpan 超時)在 System.ServiceModel.Channels.RequestChannel。請求(消息消息,時間跨度 超時)在 System.ServiceModel.Channels.ServiceChannel.Call(字符串動作, 布爾單向,ProxyOperationRuntime操作,對象[]插件, 對象[]奏,時間跨度超時)在 System.ServiceModel .Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 包括methodCall,ProxyOperationRuntime操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即時聊天 消息)在

異常重新拋出[0]:在 System.Runtime.Remoting.Proxies .RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData & MSGDATA,的Int32類型)在 MyNamespace.AuthenticationService.AuthenticationService.login(loginRequest 請求)在 MyNamespace.AuthenticationService.AuthenticationServiceClient.MyNamespace.AuthenticationService.AuthenticationService.login (login請求 請求)位於C:... \ AuthenticationService \ Reference.cs中:第1716行: MyNamespace.AuthenticationService.AuthenticationServiceClient.login(UserCredentials 憑證):第1722行
at C:... \ TestWebServ MyNamespace.Forms.TestWebService.TestLogin_Click(Object sender, EventArgs e) ice.aspx.cs:284行

以下是從Web服務我的反應貌似是Wireshark:

WireShark Screenshot

+0

如果你使用任何嗅探器(f.ex.提琴手)與您共創到你得到了什麼回來服務器的請求? 只看你的問題,似乎你正在請求一個正確的1.1 SOAP消息,但你得到一個「文本/純文本」的消息返回,這不是你的應用程序期望和那裏拋出異常。 我可能會在這裏指出顯而易見的事情,但是您得到的信息在這裏可能非常重要。 –

+0

我得到的迴應似乎是在我拋出的異常中的「響應的前788個字節」之後顯示的XML。我沒有本地防火牆訪問Web服務的權限,只能從我的測試部署服務器訪問。接下來我會用WireShark來測試它,但我期望這將驗證我的XML響應與異常文本中包含的XML響應相匹配。 – Mac

+0

儘管可以提出「明顯」的建議。我很可能會錯過一些明顯的東西。謝謝。 – Mac

回答

6

的問題是,該服務與text/plain時響應它應該與text/xmlapplication/xml響應,這正是WCF綁定期望的,以便正確處理它。從根本上說,這是服務方面的一個「問題」:它們返回XML但將其稱爲純文本,這在技術上是準確的,但不像XML內容類型那麼具體。在WCF方面,內置協議處理相當嚴格,預計內容類型爲text/xmlapplication/xml以繼續進行反序列化。

您可以通過支持text/plain,但其解析爲XML writing a custom WCF encoder挫敗他們的內容類型的問題。

+1

聽起來像一個很好的計劃。我會試試這個。謝謝! – Mac

0

如果尚未安裝WCF激活組件,則會發生此問題。請檢查下面的鏈接瞭解更多信息和類似的問題,面臨

http://bit.ly/1fYZ2wn

相關問題