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。 這個動作會釋放與訊息存留期有密切關係的有限系統資源 (例如通訊端、具名管道)。
給衍生自此類別之 Managed C++ 使用者的特別說明:
請將您的清除程式碼置於 (On)(Begin)Close (and/or 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 執行個體。 |