问题描述
当我想使用带有 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 (将#修改为@)