Web服务XML响应作为“text / plain”接收。 (还有另一种内容类型错误。)

时间:2014-01-23 15:52:17

标签: c# asp.net wcf web-services

我正在尝试开发一个Web应用程序,使用WCF向Web服务提交一个简单的登录请求,但我不断收到“响应消息的内容类型文本/明文不匹配”错误,即使Web服务出现返回有效的XML。

我已经回顾了几十个类似的S.O.有关此错误的帖子并排除了更常见的可能性:

  1. 我在回复中可以看到它不是一个错误页面(如here所述)。
  2. 我似乎没有绑定不匹配问题(如here所述)。我的应用程序和 Web服务都使用SOAP 1.1,我指定了“basicHttpBinding”。
  3. 我的错误消息中包含的响应似乎显示有效的XML 包括我想要的用户和响应变量。
  4. 我可以在Web服务日志文件中看到登录方法 完全执行而不会抛出异常。
  5. 我将XML响应粘贴到W3Schools验证器中,但没有 错误。
  6. 还有什么可能导致我的错误,为什么这不会被识别为有效的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的回应:

    WireShark Screenshot

2 个答案:

答案 0 :(得分:6)

问题是,当服务响应text/plaintext/xml时,服务正在响应application/xml,这是您的WCF绑定所期望的,以便正确处理它。从根本上说,这是服务方面的“问题”:它们返回XML但是将其称为明文,这在技术上是准确的,但不像XML内容类型那样具体。在WCF方面,内置协议处理相当严格,并且期望内容类型为text/xmlapplication/xml,以便继续对其进行反序列化。

您可以通过支持text/plain writing a custom WCF encoder 阻止其内容类型问题,但将其解析为XML。

答案 1 :(得分:0)

如果尚未安装WCF激活组件,则可能会发生此问题。请查看以下链接,了解更多信息和面临的类似问题

http://bit.ly/1fYZ2wn