【问题标题】:WCF Change message encoding from Utf-16 to Utf-8WCF 将消息编码从 Utf-16 更改为 Utf-8
【发布时间】:2019-02-23 02:38:47
【问题描述】:

我在 .net 核心应用程序中有一个 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 声明。从那以后,我可以在监视窗口中调试时看到它。

任何关于如何完成这个(应该是)简单改变的想法都会非常感激。

【问题讨论】:

  • <basicHttpBindiung> 的默认文本编码 UTF8。你用的是什么绑定?如果要更改编码,请在绑定级别进行,不要尝试修改序列化程序的工作方式。
  • 无论如何,BeforeSendRequest 是用来检查和修改消息,而不是序列化它。序列化有它自己的重载。如果您想与符合标准的 SOAP 服务进行通信,则不需要使用它们
  • UTF8 也是wsHttpBinding 的默认编码。
  • 你有没有找到解决这个问题的办法?我有同样的问题,我似乎无法找到解决方案。这似乎应该很容易。

标签: wcf utf-8 .net-core


【解决方案1】:

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

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

默认为 Utf8TextEncoding。该属性属于编码类型。 至于具体的绑定,也包含了textEncoding属性。
https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.basichttpbinding.textencoding?view=netframework-4.0
如果有什么我可以帮忙的,请随时告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2014-01-18
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多