我正在尝试开发一个Web应用程序,使用WCF向Web服务提交一个简单的登录请求,但我不断收到“响应消息的内容类型文本/明文不匹配”错误,即使Web服务出现返回有效的XML。
我已经回顾了几十个类似的S.O.有关此错误的帖子并排除了更常见的可能性:
还有什么可能导致我的错误,为什么这不会被识别为有效的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; charset = 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>
”。
服务器堆栈跟踪:at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest的 请求,HttpWebResponse响应,HttpChannelFactory工厂, WebException responseException,ChannelBinding channelBinding)at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度 超时)at System.ServiceModel.Channels.RequestChannel.Request(消息消息, TimeSpan超时)at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway,ProxyOperationRuntime操作,Object [] ins, 对象[]出局,TimeSpan超时)at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime operation)at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天 消息)
在[0]处重新抛出异常:at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即时聊天 reqMsg,IMessage retMsg)at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&安培; msgData,Int32类型)at MyNamespace.AuthenticationService.AuthenticationService.login(loginRequest 请求) MyNamespace.AuthenticationService.AuthenticationServiceClient.MyNamespace.AuthenticationService.AuthenticationService.login(loginRequest 请求)在C:... \ AuthenticationService \ Reference.cs:1716行 MyNamespace.AuthenticationService.AuthenticationServiceClient.login(UserCredentials 凭证)在C:... \ AuthenticationService \ Reference.cs:第1722行 at MyNamespace.Forms.TestWebService.TestLogin_Click(Object sender, EventArgs e)在C:... \ TestWebService.aspx.cs:第284行
以下是我在WebS服务中对WireShark的回应:
答案 0 :(得分:6)
问题是,当服务响应text/plain
或text/xml
时,服务正在响应application/xml
,这是您的WCF绑定所期望的,以便正确处理它。从根本上说,这是服务方面的“问题”:它们返回XML但是将其称为明文,这在技术上是准确的,但不像XML内容类型那样具体。在WCF方面,内置协议处理相当严格,并且期望内容类型为text/xml
或application/xml
,以便继续对其进行反序列化。
您可以通过支持text/plain
的 writing a custom WCF encoder 阻止其内容类型问题,但将其解析为XML。
答案 1 :(得分:0)
如果尚未安装WCF激活组件,则可能会发生此问题。请查看以下链接,了解更多信息和面临的类似问题