无法处理该消息,因为内容类型“应用程序/xml”不是预期的类型“应用程序/soap + xml”;字符集 = utf-8 '

Posted

技术标签:

【中文标题】无法处理该消息,因为内容类型“应用程序/xml”不是预期的类型“应用程序/soap + xml”;字符集 = utf-8 \'【英文标题】:Cannot process the message because the content type 'application / xml' was not the expected type 'application / soap + xml; charset = utf-8 '无法处理该消息,因为内容类型“应用程序/xml”不是预期的类型“应用程序/soap + xml”;字符集 = utf-8 ' 【发布时间】:2019-12-21 07:14:25 【问题描述】:

远程服务器返回错误:(415)无法处理消息,因为内容类型“应用程序/xml”不是预期的类型“应用程序/soap + xml”;字符集 = utf-8 '

我只是尝试启动我的自我主机。我有 2 个带有基本身份验证的端点。所以我不得不为此使用 wsHttpBinding。 CreateUser 端点应该使用 XML 格式和 RemoveUser 端点 - json 格式。

我附加了我的 selfhost app.config、客户端主要功能和合同。

服务器 app.config

<services>
  <service name="Web.Service.Core.Services.UserContract"
           behaviorConfiguration="AuthBehavior" >
    <endpoint address="CreateUser"
              binding="wsHttpBinding"
              bindingNamespace="http://localhost/Auth/"
              contract="Web.Service.Library.Contracts.IUserContract" />
    <endpoint address="RemoveUser"
              binding="wsHttpBinding"
              contract="Web.Service.Library.Contracts.IUserContract" />

IUserContract.cs

[ServiceContract(Namespace = "http://localhost/Auth/", ProtectionLevel = ProtectionLevel.None)]
[XmlSerializerFormat]
public interface IUserContract

    [OperationContract]
    [WebInvoke(Method = "POST",
        UriTemplate = "Auth/CreateUser",
        RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped)]
    Response CreateUser(Stream xml);

    [OperationContract]
    [WebInvoke(Method = "POST",
        UriTemplate = "Auth/RemoveUser",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped)]
    Response RemoveUser(Stream stream);

客户端 main()

var webRequest = (HttpWebRequest) WebRequest.Create(CreateUserUrl);
webRequest.Method = "POST";
webRequest.ContentType = "application/xml";
webRequest.ContentLength = data.Length;
var rqStream = webRequest.GetRequestStream();
rqStream.Write(data, 0, data.Length);
rqStream.Close();
var webResponse = webRequest.GetResponse();
var rsStream = webResponse.GetResponseStream();
var responseXml = new StreamReader(rsStream);
var s = responseXml.ReadToEnd();

【问题讨论】:

按照错误的说法,发送正确的内容类型标头。或者更好的是,生成一个 WCF 客户端。 我无法生成客户端。 VS 没有看到我的合同 :( 【参考方案1】:

当我们使用 wshttpbinding 创建 WCF 服务时,该服务基于 web 服务规范,并使用简单对象访问协议进行通信。我们可以使用 fiddler 查看通信细节。 content-type是Application/soap+xml而不是Application/xml,请求体格式基于SOAP envelop。https://en.wikipedia.org/wiki/SOAP 这种 Web 服务称为 SOAP Web 服务。通常,我们使用客户端代理类调用服务。

   ServiceReference1.ServiceClient client = new ServiceClient();
            try
            
                var result = client.GetData();
                Console.WriteLine(result);
            
            catch (Exception)
            

                throw;
            

https://docs.microsoft.com/en-us/dotnet/framework/wcf/accessing-services-using-a-wcf-client 调用服务的方式通常适用于 Restful 风格的服务。https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design 实例化 HttpClient 类并自定义请求正文。在这种情况下,我们应该使用 WCF 中的 WebHttpBinding 来创建服务。请参考我的回复。How to fix "ERR_ABORTED 400 (Bad Request)" error with Jquery call to C# WCF service? 如果有什么可以帮助的,请随时告诉我。

已更新。

class Program

    /// <summary>
    /// https webhttpbinding.
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    
        Uri uri = new Uri("https://localhost:4386");
        WebHttpBinding binding = new WebHttpBinding();
        binding.Security.Mode = WebHttpSecurityMode.Transport;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;


        using (WebServiceHost sh = new WebServiceHost(typeof(TestService), uri))
        
            sh.AddServiceEndpoint(typeof(ITestService), binding, "");
            ServiceMetadataBehavior smb;
            smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
            if (smb == null)
            
                smb = new ServiceMetadataBehavior()
                
                    //HttpsGetEnabled = true
                ;
                sh.Description.Behaviors.Add(smb);

            
            Binding mexbinding = MetadataExchangeBindings.CreateMexHttpsBinding();
            sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");


            sh.Opened += delegate
            
                Console.WriteLine("service is ready");
            ;
            sh.Closed += delegate
            
                Console.WriteLine("service is closed");
            ;
            sh.Open();

            Console.ReadLine();

            sh.Close();
        
    

[ServiceContract]
public interface ITestService

    [OperationContract]
    [WebGet(ResponseFormat =WebMessageFormat.Json)]
    string GetResult();


[ServiceBehavior]
public class TestService : ITestService

    public string GetResult()
    
        return $"Hello, busy World. DateTime.Now.ToShortTimeString()";
    

将证书绑定到端口(Powershell 命令)。

    netsh http add sslcert ipport=0.0.0.0:4386 certhash=cbc81f77ed01a9784a12483030ccd497f01be71c App
id='61466809-CD17-4E31-B87B-E89B003FABFA'

结果。

【讨论】:

感谢您的回复。但我还有一个问题:如何将基本身份验证与 webHttpBinding 一起使用? 我们需要将webhttpbinding的client credential type设置为basic,如有需要,我会发一个例子。 我为此添加了配置。 &lt;endpoint address="CreateUser" binding="webHttpBinding" bindingConfiguration="WebHttpBinding" contract="Web.Service.Library.Contracts.IUserContract" /&gt;&lt;webHttpBinding&gt; &lt;binding name="WebHttpBinding"&gt; &lt;security mode="Transport"&gt; &lt;transport clientCredentialType="Basic" /&gt; &lt;/security&gt; &lt;/binding&gt; &lt;/webHttpBinding&gt; 没问题,如果指定了传输安全模式,我们还需要给https地址端口绑定一个证书。 哦。因此,对于使用 xml/json,我需要使用 webHttpBinding。然后我需要使用基本身份验证。为此,我需要使用 https 而不是 http。如果我理解正确,请告诉我,如何在不使用 iis 和 asp 的情况下添加 https ?有没有更好更简单的解决方案?

以上是关于无法处理该消息,因为内容类型“应用程序/xml”不是预期的类型“应用程序/soap + xml”;字符集 = utf-8 '的主要内容,如果未能解决你的问题,请参考以下文章

无法处理消息,因为内容类型 'text/xml;charset=UTF-8' 不是预期的类型 'application/soap+xml;字符集=utf-8'

无法处理消息,因为内容类型“application/soap+msbin1”不是预期的类型“text/xml”

无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml;字符集=utf-8'

HTTP 415 无法处理消息,因为内容类型为 'application/json; charset=utf-8' 不是预期的类型 'text/xml;字符集=utf-8'

Java SOAP 消息内容类型

由于异常 'application/soap+xml; 无法处理该消息;不是预期的类型“应用程序/soap+msbin1”