在 BindingContext 的 BindingParameters 中发现不止一个 MessageEncodingBindingElement

问题描述

当我想使用带有 SOAP 的外部 Web 服务时出现此错误

More than one MessageEncodingBindingElement was found in the BindingParameters of the BindingContext.  This usually is caused by having multiple MessageEncodingBindingElements in a CustomBinding. Remove all but one of these elements.

我已经尝试了所有方法,我已经尝试从该网络服务获得结果 2 天了,但我无法解决错误,有人可以帮助我吗?

我的 App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
</configuration>

我在 Program.cs 主类中的代码

WSHttpBinding myBinding = new WSHttpBinding();
        myBinding.Security.Mode = SecurityMode.Transport;
        myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

        CustomTextMessageBindingElement customBindingElement = new CustomTextMessageBindingElement("UTF-8","text/xml",MessageVersion.soap11);
        CustomBinding binding = new CustomBinding(myBinding);
        
        binding.Elements.RemoveAt(0);
        binding.Elements.Insert(0,customBindingElement);


        EndpointAddress address = new
            EndpointAddress("https://localhost/anything");

        ServiceReference.consultaClient service = new ServiceReference.consultaClient(binding,address);

        

        service.ClientCredentials.UserName.UserName = "UserName";
        service.ClientCredentials.UserName.Password = "Password";
        try
        {
            // Begin using the client.
            service.open();

            ServiceReference.response response = service.getData("17169");

            if (response.descripcionError == null)
            {
                Console.WriteLine(response.data);
            }
            else
            {
                Console.WriteLine("|||||||||||||||||||||||||||||||||||||||||||||");
                Console.WriteLine(response.data);
                Console.WriteLine(response.descripcionError);
                Console.WriteLine("|||||||||||||||||||||||||||||||||||||||||||||");
            }


            service.Close();
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }

类 CustomTextMessageBindingElement

public class CustomTextMessageBindingElement : MessageEncodingBindingElement
{
    private MessageVersion _msgVersion;
    private string _mediaType;
    private string _encoding;
    private XmlDictionaryReaderQuotas _readerQuotas;

    private CustomTextMessageBindingElement(CustomTextMessageBindingElement binding)
        : this(binding.Encoding,binding.MediaType,binding.MessageVersion)
    {
        _readerQuotas = new XmlDictionaryReaderQuotas();
        binding.ReaderQuotas.copyTo(_readerQuotas);
    }

    public CustomTextMessageBindingElement(string encoding,string mediaType,MessageVersion msgVersion)
    {
        if (encoding == null)
            throw new ArgumentNullException("encoding");

        if (mediaType == null)
            throw new ArgumentNullException("mediaType");

        if (msgVersion == null)
            throw new ArgumentNullException("msgVersion");

        _msgVersion = msgVersion;
        _mediaType = mediaType;
        _encoding = encoding;
        _readerQuotas = new XmlDictionaryReaderQuotas();
    }

    public CustomTextMessageBindingElement(string encoding,string mediaType)
: this(encoding,mediaType,System.ServiceModel.Channels.MessageVersion.soap12WSAddressing10)
    {
    }

    public CustomTextMessageBindingElement(string encoding)
        : this(encoding,"text/xml")
    {
    }

    public override MessageVersion MessageVersion
    {
        get
        {
            return _msgVersion;
        }

        set
        {
            if (value == null)
                throw new ArgumentNullException("value");
            _msgVersion = value;
        }
    }

    public string MediaType
    {
        get
        {
            return _mediaType;
        }

        set
        {
            if (value == null)
                throw new ArgumentNullException("value");
            _mediaType = value;
        }
    }

    public string Encoding
    {
        get
        {
            return _encoding;
        }

        set
        {
            if (value == null)
                throw new ArgumentNullException("value");
            _encoding = value;
        }
    }

    // This encoder does not enforces any quotas for the unsecure messages. The 
    // quotas are enforced for the secure portions of messages when this encoder
    // is used in a binding that is configured with security. 
    public XmlDictionaryReaderQuotas ReaderQuotas
    {
        get
        {
            return _readerQuotas;
        }
    }

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

    public override BindingElement Clone()
    {
        return new CustomTextMessageBindingElement(this);
    }

    public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        context.BindingParameters.Add(this);
        return context.BuildInnerChannelFactory<TChannel>();
    }

    public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        return context.CanBuildInnerChannelFactory<TChannel>();
    }

    public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        context.BindingParameters.Add(this);
        return context.BuildInnerChannelListener<TChannel>();
    }

    public override bool CanBuildChannelListener<TChannel>(BindingContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        context.BindingParameters.Add(this);
        return context.CanBuildInnerChannelListener<TChannel>();
    }

    public override T GetProperty<T>(BindingContext context)
    {
        if (typeof(T) == typeof(XmlDictionaryReaderQuotas))
        {
            return (T)(object)_readerQuotas;
        }

        return base.GetProperty<T>(context);
    }
}

类 CustomTextMessageEncoder:

internal class CustomTextMessageEncoder : System.ServiceModel.Channels.MessageEncoder
{
    private CustomTextMessageEncoderFactory _factory;
    private XmlWriterSettings _writerSettings;
    private string _contentType;

    public CustomTextMessageEncoder(CustomTextMessageEncoderFactory factory)
    {
        _factory = factory;

        _writerSettings = new XmlWriterSettings();
        _writerSettings.Encoding = Encoding.GetEncoding(factory.CharSet);
        _contentType = string.Format("{0}; charset={1}",_factory.MediaType,_writerSettings.Encoding.WebName);
    }

    public override string ContentType
    {
        get
        {
            return _contentType;
        }
    }

    public override string MediaType
    {
        get
        {
            return _factory.MediaType;
        }
    }

    public override MessageVersion MessageVersion
    {
        get
        {
            return _factory.MessageVersion;
        }
    }

    public override Message ReadMessage(Stream stream,int maxSizeOfheaders,string contentType)
    {
        XmlReader reader = XmlReader.Create(stream);
        return Message.CreateMessage(reader,maxSizeOfheaders,MessageVersion);
    }

    public override Message ReadMessage(ArraySegment<byte> buffer,BufferManager bufferManager,string contentType)
    {
        byte[] msgContents = new byte[buffer.Count];
        Array.copy(buffer.Array,buffer.Offset,msgContents,msgContents.Length);
        bufferManager.ReturnBuffer(buffer.Array);

        MemoryStream stream = new MemoryStream(msgContents);
        return ReadMessage(stream,int.MaxValue);
    }

    public override void WriteMessage(Message message,Stream stream)
    {
        using (XmlWriter writer = XmlWriter.Create(stream,_writerSettings))
        {
            message.WriteMessage(writer);
        }
    }

    public override ArraySegment<byte> WriteMessage(Message message,int maxMessageSize,int messageOffset)
    {
        ArraySegment<byte> messageBuffer;
        byte[] writeBuffer = null;

        int messageLength;
        using (MemoryStream stream = new MemoryStream())
        {
            using (XmlWriter writer = XmlWriter.Create(stream,_writerSettings))
            {
                message.WriteMessage(writer);
            }

            // TryGetBuffer is the preferred path but requires 4.6
            //stream.TryGetBuffer(out messageBuffer);
            writeBuffer = stream.ToArray();
            messageBuffer = new ArraySegment<byte>(writeBuffer);

            messageLength = (int)stream.Position;
        }

        int totalLength = messageLength + messageOffset;
        byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
        Array.copy(messageBuffer.Array,totalBytes,messageOffset,messageLength);

        ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes,messageLength);
        return byteArray;
    }


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

    }

类 CustomTextMessageEncoderFactory:

internal class CustomTextMessageEncoderFactory : MessageEncoderFactory
{
    private System.ServiceModel.Channels.MessageEncoder _encoder;
    private MessageVersion _version;
    private string _mediaType;
    private string _charSet;

    internal CustomTextMessageEncoderFactory(string mediaType,string charSet,MessageVersion version)
    {
        _version = version;
        _mediaType = mediaType;
        _charSet = charSet;
        _encoder = new CustomTextMessageEncoder(this);
    }

    public override System.ServiceModel.Channels.MessageEncoder Encoder
    {
        get
        {
            return _encoder;
        }
    }

    public override MessageVersion MessageVersion
    {
        get
        {
            return _version;
        }
    }

    internal string MediaType
    {
        get
        {
            return _mediaType;
        }
    }

    internal string CharSet
    {
        get
        {
            return _charSet;
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)