如何在SOAP请求中设置编码?

时间:2019-01-07 12:23:15

标签: c# soap .net-core

我正在尝试通过使用SOAP使用.NET Core 2.0中的Web服务。该Web服务的客户端是使用Visual Studio的“连接服务”功能生成的。

现在,我遇到了问题,Web服务需要在请求中的(第一行)编码属性:

<?xml version="1.0" encoding="utf-8"?>

我尝试了多种方法在output-XML中编写此行,但是没有任何效果。

第一种方法:

我使用定制的消息检查器(通过实现IClientMessageInspector)向客户端添加了新的端点行为(通过实现IEndpointBehavior)。通过调试我发现,消息对象包含上述行。但是通过将传出的XML写入Web服务,该行丢失了。

第二种方法:

我编写了一个具有wsdl导出扩展名的自定义消息编码绑定元素(通过使用MessageEncodingBindingElement和IWsdlExportExtension)。此绑定元素使用自定义的MessageEncoder,在其中明确设置了编码。我将绑定添加到生成的客户端。

以下是一些.net 4.6代码片段:

// Binding for the client
TextMessageBindingElement textBindingElement = new TextMessageBindingElement();
textBindingElement.Encoding = "utf-8";
textBindingElement.MessageVersion = MessageVersion.Soap11;
textBindingElement.MediaType = "text/xml";

bindingElements.Add(textBindingElement);

CustomBinding binding = new CustomBinding(bindingElements);

// Customized Message Binding Element for encoding
public class TextMessageBindingElement : MessageEncodingBindingElement, 
IWsdlExportExtension {

    public override MessageVersion MessageVersion { get; set; }
    public string Encoding { get; set; }

    ...

    public override MessageEncoderFactory CreateMessageEncoderFactory() {
        return new TextMessageEncoderFactory(MediaType, Encoding, MessageVersion);
    }

    void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context) {
    }

    void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context) {
         TextMessageEncodingBindingElement mebe = new TextMessageEncodingBindingElement();
         mebe.MessageVersion = this.msgVersion;
         ((IWsdlExportExtension) mebe).ExportEndpoint(exporter, context);
    }
}

在.NET 4.6中可以使用,但是.NET Core 2.0不支持IWsdlExportExtension。我在寻找替代品,但还没有找到任何东西。

请,有人可以帮助我吗?

0 个答案:

没有答案