内容类型文本/xml;字符集= 响应消息的"utf-8"与绑定的内容类型不匹配(文本/XML;字符集=UTF-8)



请注意,此问题与WCF Connected Services的.NET Core实现有关。

我正在将常规的.NET WCF客户端移植到.NET Core,但是我遇到了这个问题:

The content type text/xml; charset="utf-8" of the response message does
not match the content type of the binding (text/xml; charset=utf-8).
If using a custom encoder, be sure that the IsContentTypeSupported method is
implemented properly. The first 1024 bytes of the response were: 
'<?xml version='1.0' encoding='UTF-8'?> [...]

响应确实包含引号:

HTTP/1.1 200 Ok
content-type: text/xml; charset="utf-8"

我从来没有做过任何特别的事情来处理这个问题。这是 .NET Core 版本中的错误,还是它只是非常特定于内容类型(utf-8 与"utf-8")?

如何更改预期的内容类型以匹配我正在调用的服务?(我无法控制这一点,但如果需要,我可以复制和更改 WSDL)。

我正在使用 svcutil 生成的客户端。(连接服务)

看起来.NET Core版本确实对此更加挑剔。无论如何,我设法使用自定义编码器解决了它。

我公然从Github偷走了CustomTextMessageEncoder。我添加了以下方法:

public override bool IsContentTypeSupported(string contentType)
{
    return true;
}

并从同一个地方偷了CustomTextMessageBindingElementCustomTextMessageEncoderFactory

我通过创建自定义绑定来添加它们(basicBinding 是我之前的绑定):

var customBindingElement = new CustomTextMessageBindingElement("UTF-8", "text/xml", MessageVersion.Soap11);
var binding = new CustomBinding(basicBinding);
binding.Elements.RemoveAt(0);
binding.Elements.Insert(0, customBindingElement);
var client = (T2)Activator.CreateInstance(typeof(T), binding, address);

我使用激活器来动态生成代理。只需替换为对 WCF 生成的客户端的调用即可。

两个放错位置的报价需要做很多工作:D

我也有同样的问题。可能存在与安全相关或内容类型格式差异的问题。我通过忽略服务引用绑定解决了这个问题。您应该直接使用 HttpWebRequest 调用作为样本;

  private string GetWebService(string token, int testId, string phone)
    {
        try
        {
            var serviceUrl = "https://test.com/Soap";
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            httpWebRequest.ContentType = "text/xml";
            httpWebRequest.Method = "POST";
            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                var xmlData = "<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:doc="http://test.com">" +
                "   <soapenv:Header/>" +
                "   <soapenv:Body>" +
                "      <doc:AskForStackOverFlow>" +
                "         <doc:token>" + token + "</doc:token>" +
                "         <doc:testId>" + testId+ "</doc:testId>" +
                "         <doc:phone>" + phone + "</doc:phone>" +
                "         <doc:startTime>" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "</doc:startTime>" +
                "      </doc:AskForStackOverFlow>" +
                "   </soapenv:Body>" +
                "</soapenv:Envelope>";
                streamWriter.Write(xmlData);
            }
            var xmlResult = "";
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                xmlResult = streamReader.ReadToEnd();
            }
            if (string.IsNullOrEmpty(xmlResult))
                return "";

            var result = "";
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlResult);
            XmlNodeList nodes = doc.GetElementsByTagName("ns1:AskForStackOverFlowResult");
            foreach (XmlNode item in nodes)
            {
                result = item.InnerText;
            }
            return result;
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }

将 WCF 客户端转换为 dotnet 核心后,我遇到了完全相同的错误。 我必须重构一些。 我替换了我的绑定代码。 注意 WsBinding 在 dotnet core 中不是本机的。

https://github.com/dotnet/wcf/issues/1370

相关内容

  • 没有找到相关文章

最新更新