MessageEncodingBindingElement 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
用于指定对消息进行编码时所用消息版本的绑定元素。
public ref class MessageEncodingBindingElement abstract : System::ServiceModel::Channels::BindingElement
public abstract class MessageEncodingBindingElement : System.ServiceModel.Channels.BindingElement
type MessageEncodingBindingElement = class
inherit BindingElement
Public MustInherit Class MessageEncodingBindingElement
Inherits BindingElement
- 继承
- 派生
示例
下面的代码示例演示如何实现派生自 MessageEncodingBindingElement 的类。
public class CustomTextMessageBindingElement : MessageEncodingBindingElement, IWsdlExportExtension
{
private MessageVersion msgVersion;
private string mediaType;
private string encoding;
private XmlDictionaryReaderQuotas readerQuotas;
CustomTextMessageBindingElement(CustomTextMessageBindingElement binding)
: this(binding.Encoding, binding.MediaType, binding.MessageVersion)
{
this.readerQuotas = new XmlDictionaryReaderQuotas();
binding.ReaderQuotas.CopyTo(this.readerQuotas);
}
public CustomTextMessageBindingElement(string encoding, string mediaType,
MessageVersion msgVersion)
{
if (encoding == null)
throw new ArgumentNullException(nameof(encoding));
if (mediaType == null)
throw new ArgumentNullException(nameof(mediaType));
if (msgVersion == null)
throw new ArgumentNullException(nameof(msgVersion));
this.msgVersion = msgVersion;
this.mediaType = mediaType;
this.encoding = encoding;
this.readerQuotas = new XmlDictionaryReaderQuotas();
}
public CustomTextMessageBindingElement(string encoding, string mediaType)
: this(encoding, mediaType, MessageVersion.Soap11WSAddressing10)
{
}
public CustomTextMessageBindingElement(string encoding)
: this(encoding, "text/xml")
{
}
public CustomTextMessageBindingElement()
: this("UTF-8")
{
}
public override MessageVersion MessageVersion
{
get
{
return this.msgVersion;
}
set
{
if (value == null)
throw new ArgumentNullException(nameof(value));
this.msgVersion = value;
}
}
public string MediaType
{
get
{
return this.mediaType;
}
set
{
if (value == null)
throw new ArgumentNullException(nameof(value));
this.mediaType = value;
}
}
public string Encoding
{
get
{
return this.encoding;
}
set
{
if (value == null)
throw new ArgumentNullException(nameof(value));
this.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 this.readerQuotas;
}
}
#region IMessageEncodingBindingElement Members
public override MessageEncoderFactory CreateMessageEncoderFactory()
{
return new CustomTextMessageEncoderFactory(this.MediaType,
this.Encoding, this.MessageVersion);
}
#endregion
public override BindingElement Clone()
{
return new CustomTextMessageBindingElement(this);
}
public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
context.BindingParameters.Add(this);
return context.BuildInnerChannelFactory<TChannel>();
}
public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
return context.CanBuildInnerChannelFactory<TChannel>();
}
public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
context.BindingParameters.Add(this);
return context.BuildInnerChannelListener<TChannel>();
}
public override bool CanBuildChannelListener<TChannel>(BindingContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
context.BindingParameters.Add(this);
return context.CanBuildInnerChannelListener<TChannel>();
}
public override T GetProperty<T>(BindingContext context)
{
if (typeof(T) == typeof(XmlDictionaryReaderQuotas))
{
return (T)(object)this.readerQuotas;
}
else
{
return base.GetProperty<T>(context);
}
}
#region IWsdlExportExtension Members
void IWsdlExportExtension.ExportContract(WsdlExporter exporter, WsdlContractConversionContext context)
{
}
void IWsdlExportExtension.ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context)
{
// The MessageEncodingBindingElement is responsible for ensuring that the WSDL has the correct
// SOAP version. We can delegate to the WCF implementation of TextMessageEncodingBindingElement for this.
TextMessageEncodingBindingElement mebe = new TextMessageEncodingBindingElement();
mebe.MessageVersion = this.msgVersion;
((IWsdlExportExtension)mebe).ExportEndpoint(exporter, context);
}
#endregion
}
注解
编码是将消息转换为一个字节序列的过程。 解码是反向过程。 Windows Communication Foundation (WCF) 包含三种类型的 SOAP 消息编码:文本、二进制和消息传输优化机制 (MTOM)。
如果希望实现自定义消息编码器,请使用此类。 若要实现自己的自定义消息编码器,必须提供以下三个抽象基类的自定义实现:
重写 Encoder 以返回自定义 MessageEncoder 的实例。 重写 CreateMessageEncoderFactory 方法以返回此工厂的实例。
从 MessageEncodingBindingElement 派生的任何类型负责更新为服务生成的 WSDL 文档中 SOAP 绑定的版本。 实现 ExportEndpoint(WsdlExporter, WsdlEndpointConversionContext) 方法以修改生成的 WSDL,即可完成此操作。
Windows Communication Foundation (WCF) 提供了三种类型的绑定元素,这些元素派生自 MessageEncodingBindingElement 类,这些元素可为文本、二进制和消息传输优化机制提供 (MTOM) 编码。
TextMessageEncodingBindingElement:互操作性最高但效率最低的 XML 消息编码器。 Web 服务或 Web 服务客户端通常都能理解文本 XML。 但是,将大型二进制数据块作为文本传输不是有效的传输方式。
BinaryMessageEncodingBindingElement:表示绑定元素,该元素指定用于基于二进制的 XML 消息的字符编码和消息版本控制。 这是效率最高但互操作性最低的编码选项。
MtomMessageEncodingBindingElement:表示绑定元素,该元素指定使用消息传输优化机制 (MTOM) 编码的消息使用的字符编码和消息版本控制。 MTOM 是一种用于在 WCF 消息中传输二进制数据的有效技术。 MTOM 编码器力图在效率和互操作性之间取得平衡。 MTOM 编码以文本形式传输大多数 XML,但是会通过按原样(即不转换为文本)的方式传输来优化大型二进制数据块。
构造函数
MessageEncodingBindingElement() |
初始化 MessageEncodingBindingElement 类的新实例。 |
MessageEncodingBindingElement(MessageEncodingBindingElement) |
初始化从现有元素初始化的 MessageEncodingBindingElement 类的新实例。 |
属性
MessageVersion |
在派生类中重写时,获取或设置可由消息编码器工厂所生成消息编码器处理的消息版本。 |
方法
BuildChannelFactory<TChannel>(BindingContext) |
初始化通道工厂,用于生成来自绑定上下文中指定类型的通道。 (继承自 BindingElement) |
BuildChannelListener<TChannel>(BindingContext) |
初始化通道侦听器,用于接受绑定上下文中指定类型的通道。 (继承自 BindingElement) |
CanBuildChannelFactory<TChannel>(BindingContext) |
返回一个值,该值指示绑定元素是否可以为特定类型的通道生成通道工厂。 (继承自 BindingElement) |
CanBuildChannelListener<TChannel>(BindingContext) |
返回一个值,该值指示绑定元素是否可以为特定类型的通道生成侦听器。 (继承自 BindingElement) |
Clone() |
在派生类中重写时,返回绑定元素对象的副本。 (继承自 BindingElement) |
CreateMessageEncoderFactory() |
在派生类中重写时,创建工厂以生成消息编码器。 |
Equals(Object) |
确定指定对象是否等于当前对象。 (继承自 Object) |
GetHashCode() |
作为默认哈希函数。 (继承自 Object) |
GetProperty<T>(BindingContext) |
从通道堆栈的适当层,返回所请求的类型化对象(如果存在)。 |
GetType() |
获取当前实例的 Type。 (继承自 Object) |
MemberwiseClone() |
创建当前 Object 的浅表副本。 (继承自 Object) |
ToString() |
返回表示当前对象的字符串。 (继承自 Object) |