Message 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示分布式环境中终结点之间的通信单元。
public ref class Message abstract : IDisposable
public abstract class Message : IDisposable
type Message = class
interface IDisposable
Public MustInherit Class Message
Implements IDisposable
- 继承
-
Message
- 实现
示例
下面的代码示例演示了使用通道工厂发送消息并读取回复的客户端。
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Runtime.Serialization;
namespace ConsoleApplication1
{
class client
{
static void RunClient()
{
//Step1: create a binding with just HTTP
CustomBinding binding = new CustomBinding();
binding.Elements.Add(new HttpTransportBindingElement());
//Step2: use the binding to build the channel factory
IChannelFactory<IRequestChannel> factory =
binding.BuildChannelFactory<IRequestChannel>(
new BindingParameterCollection());
//open the channel factory
factory.Open();
//Step3: use the channel factory to create a channel
IRequestChannel channel = factory.CreateChannel(
new EndpointAddress("http://localhost:8080/channelapp"));
channel.Open();
//Step4: create a message
Message requestmessage = Message.CreateMessage(
MessageVersion.Soap12WSAddressing10,
"http://contoso.com/someaction",
"This is the body data");
//send message
Message replymessage = channel.Request(requestmessage);
Console.WriteLine("Reply message received");
Console.WriteLine("Reply action: {0}",
replymessage.Headers.Action);
string data = replymessage.GetBody<string>();
Console.WriteLine("Reply content: {0}", data);
//Step5: don't forget to close the message
requestmessage.Close();
replymessage.Close();
//don't forget to close the channel
channel.Close();
//don't forget to close the factory
factory.Close();
}
public static void Main()
{
Console.WriteLine("Press [ENTER] when service is ready");
Console.ReadLine();
RunClient();
Console.WriteLine("Press [ENTER] to exit");
Console.ReadLine();
}
}
}
Imports System.Collections.Generic
Imports System.Text
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.Runtime.Serialization
Namespace ConsoleApplication1
Friend Class client
Private Shared Sub RunClient()
'Step1: create a binding with just HTTP
Dim binding As New CustomBinding()
binding.Elements.Add(New HttpTransportBindingElement())
'Step2: use the binding to build the channel factory
Dim factory As IChannelFactory(Of IRequestChannel) = binding.BuildChannelFactory(Of IRequestChannel)(New BindingParameterCollection())
'open the channel factory
factory.Open()
'Step3: use the channel factory to create a channel
Dim channel As IRequestChannel = factory.CreateChannel(New EndpointAddress("http://localhost:8080/channelapp"))
channel.Open()
'Step4: create a message
Dim requestmessage As Message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "http://contoso.com/someaction", "This is the body data")
'send message
Dim replymessage As Message = channel.Request(requestmessage)
Console.WriteLine("Reply message received")
Console.WriteLine("Reply action: {0}", replymessage.Headers.Action)
Dim data = replymessage.GetBody(Of String)()
Console.WriteLine("Reply content: {0}", data)
'Step5: don't forget to close the message
requestmessage.Close()
replymessage.Close()
'don't forget to close the channel
channel.Close()
'don't forget to close the factory
factory.Close()
End Sub
Public Shared Sub Main()
Console.WriteLine("Press [ENTER] when service is ready")
Console.ReadLine()
RunClient()
Console.WriteLine("Press [ENTER] to exit")
Console.ReadLine()
End Sub
End Class
End Namespace
注解
Message 类提供一种方法,使网络中的发送方和接收方之间可对任意信息进行通信。 使用它可以传递信息、建议或要求执行一系列操作或请求数据。
Message 对象的结构表示的是 SOAP 信封。 它由两个不同的部分组成:消息的正文和一个可选择的标头集合,由 Headers 类表示。 消息内容是发送方发送给接收方的应用程序定义数据。 消息头使系统和应用程序具有了扩展性来满足变化的需求,因为您可以定义代码来操作和响应特定标头。 您也可以定义自己的标头。 消息头与消息内容一起进行序列化或反序列化。
以特别的格式接收和发送消息。 支持两种格式:基于文本的标准 XML 格式和基于二进制的 XML 格式。 Message 对象可用于表示 SOAP 1.1 和 SOAP 1.2 信封。 请注意,Message 的实例在创建时已固定,并绑定到特定的 SOAP 版本。 Version 属性表示消息的 SOAP 版本。
使用 Message 方法可将 WriteMessage 对象序列化到外部存储区。 也可将消息的属性序列化,但需要对它们单独进行标识并分别进行序列化。 使用 Message,可反序列化消息来创建一个内存中 CreateMessage 对象。 针对特定的 Message 实例,属性也必须是单独进行反序列化,并手动添加到属性集合中。
Message 对象的大小也固定为其传输的数据的大小。 每个正文都建模为 XmlReader 的实例,对于 XmlReader 实例包装的流的大小没有预定义限制。 但是,特定的通道提供程序可以对其处理的消息的大小做出限制。
使用一个已检查和处理了消息的实体所生成的有用信息可批注 Message。 Headers 和 Properties 属性提供了此功能。 Headers 集合表示消息上的 SOAP 标头集。
Properties 属性表示消息上的处理级别批注集。 由于标头中的信息通过网络传输,检查标头的实体必须支持标头使用的协议的基础版本。 但是,属性提供一种与版本更加无关的方式来批注消息。
若要创建 Message 实例,请使用其中一个 CreateMessage 方法。
建议消息使用者使用完消息内容后,总是调用 Close。 此操作可释放与消息生存期相关联的有限系统资源(如套接字、命名管道)。
针对从此类派生的托管 C++ 用户的特别说明:
将清理代码放入 (On)(Begin)Close(和/或 OnAbort)中,而不是放入析构函数中。
避免使用析构函数:它们会导致编译器自动生成 IDisposable。
避免使用非引用成员:它们可能会导致编译器自动生成 IDisposable。
避免使用终结器;但如果包含一个终结器,则应该禁止显示生成警告并从 (On)(Begin)Close(和/或 OnAbort)调用 SuppressFinalize(Object) 和终结器本身,以便模拟自动生成的 IDisposable 行为。
实施者说明
当从 Message 继承时,必须重写下面的成员:Headers 和 Version。
构造函数
Message() |
初始化 Message 类的新实例。 |
属性
Headers |
在派生类中重写时,获取消息的标头。 |
IsDisposed |
返回一个值,该值指示是否已释放 Message。 |
IsEmpty |
返回一个值,该值指示 Message 是否为空。 |
IsFault |
获取一个值,该值指示此消息是否会生成任何 SOAP 错误。 |
Properties |
在派生类中重写时,获取消息的处理级别批注集。 |
State |
获取此 Message 的当前状态。 |
Version |
在派生类中重写时,获取消息的 SOAP 版本。 |
方法
显式接口实现
IDisposable.Dispose() |
关闭此消息使用的所有资源。 无法继承此方法。 |
扩展方法
ToHttpRequestMessage(Message) |
通过 HttpRequestMessage 实例创建 Message 实例。 |
ToHttpResponseMessage(Message) |
通过 HttpResponseMessage 实例创建 Message 实例。 |