我正在嘗試開發一個Web應用程序,該應用程序使用WCF向Web服務提交簡單的登錄請求,但我一直在收到「內容類型文本/回覆消息不匹配」錯誤即使Web服務似乎正在返回有效的XML。以「text/plain」形式接收Web Service XML響應。 (還有另一種內容類型錯誤)
我回顧了幾十個相似的S.O.帖子關於這個錯誤,並已排除了比較常見的可能性:
- 我可以在響應看到它是不是一個錯誤頁面回來(如討論here)。
- 我似乎沒有約束力不匹配問題(如here所述)。我的應用程序和 Web服務都使用SOAP 1.1,並且我指定了「basicHttpBinding」。
- 包含在我的錯誤消息中的響應似乎顯示有效的XML ,其中包含我想要的用戶和響應變量。
- 我可以在Web服務日誌文件中看到登錄方法是 完全執行而不會引發異常。
- 我將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:
如果你使用任何嗅探器(f.ex.提琴手)與您共創到你得到了什麼回來服務器的請求? 只看你的問題,似乎你正在請求一個正確的1.1 SOAP消息,但你得到一個「文本/純文本」的消息返回,這不是你的應用程序期望和那裏拋出異常。 我可能會在這裏指出顯而易見的事情,但是您得到的信息在這裏可能非常重要。 –
我得到的迴應似乎是在我拋出的異常中的「響應的前788個字節」之後顯示的XML。我沒有本地防火牆訪問Web服務的權限,只能從我的測試部署服務器訪問。接下來我會用WireShark來測試它,但我期望這將驗證我的XML響應與異常文本中包含的XML響應相匹配。 – Mac
儘管可以提出「明顯」的建議。我很可能會錯過一些明顯的東西。謝謝。 – Mac