WCF将消息编码从Utf-16更改为Utf-8

5
我在一个.NET Core应用程序中使用WCF连接的服务。 我正在使用自动生成的代码,其中包含wsdl定义。
目前,在请求XML的顶部包含以下行:
<?xml version="1.0" encoding="utf-16"?> 当发送请求时,我找不到简单的方法将此编码更改为UTF-8。
由于我无法在请求/客户端对象的配置选项中找到更改消息的选项,因此我已尝试使用以下代码更改消息: IClientMessageInspector.BeforeSendRequest
    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        // Load a new xml document from current request
        var xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(request.ToString());
        ((XmlDeclaration)xmlDocument.FirstChild).Encoding = Encoding.UTF8.HeaderName;

        // Create streams to copy 
        var memoryStream = new MemoryStream();
        var xmlWriter = XmlWriter.Create(memoryStream);

        xmlDocument.Save(xmlWriter);
        xmlWriter.Flush();
        xmlWriter.Close();
        memoryStream.Position = 0;
        var xmlReader = XmlReader.Create(memoryStream);

        // Create a new message
        var newMessage = Message.CreateMessage(request.Version, null, xmlReader);
        newMessage.Headers.CopyHeadersFrom(request);
        newMessage.Properties.CopyProperties(request.Properties);
        return null;
    }

但是newMessage对象仍然使用utf-16编写xml声明。我可以在调试时在监视窗口中看到它。

有没有想法如何实现这个(应该是)简单的更改将非常赞赏。


默认的文本编码为UTF8。您使用了哪种绑定?如果要更改编码,请在绑定级别进行更改,不要尝试修改序列化程序的工作方式。 - Panagiotis Kanavos
无论如何,“BeforeSendRequest”都是用于检查和修改消息,而不是对其进行序列化。序列化有其自己的重载。但是,如果您想与符合标准的SOAP服务通信,则不需要使用它们。 - Panagiotis Kanavos
UTF8也是wsHttpBinding的默认编码。 - Panagiotis Kanavos
5
你有没有找到解决这个问题的方法?我遇到了相同的问题,但似乎找不到解决办法。这看起来应该很容易解决。 - Zamotic
1个回答

0

您使用哪种绑定来创建通信通道?TextMessageEncoding元素通常包含在CustomBinding中,其中包含TextEncoding属性。
https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/wcf/textmessageencoding
WriteEncoding属性指定用于在绑定上发出消息的字符集编码。有效值为:

  • UnicodeFffeTextEncoding:Unicode BigEndian编码
  • Utf16TextEncoding:Unicode编码
  • Utf8TextEncoding:8位编码

默认值为Utf8TextEncoding。此属性的类型为Encoding。 至于特定的绑定,它也包含textEncoding属性。
https://learn.microsoft.com/en-us/dotnet/api/system.servicemodel.basichttpbinding.textencoding?view=netframework-4.0
如果有任何需要帮助的地方,请随时让我知道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接