Message 類別

定義

表示分散式環境中端點之間的通訊單位。

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 可加上由已檢查並處理訊息的實體所產生之有用資訊的註解。 這個功能是由 HeadersProperties 屬性提供。 Headers 集合表示訊息上的一組 SOAP 標頭。

Properties 屬性表示訊息上的一組處理等級附註。 由於標頭中的資訊會在網路上傳輸,因此檢查標頭的實體必須支援該標頭所使用通訊協定的基礎版本。 然而,屬性會提供與版本更加無關的方法來註解訊息。

如果要建立 Message 執行個體,請使用其中一種 CreateMessage 方法。

建議訊息消費者在完成存取訊息的內容時,一定要呼叫 Close。 這個動作會釋放與訊息存留期有密切關係的有限系統資源 (例如通訊端、具名管道)。

給衍生自此類別之 Managed C++ 使用者的特別說明:

  • 請將您的清除程式碼置於 (On)(Begin)Close (and/or OnAbort),而不是解構函式。

  • 避免使用解構函式,因為它們會導致編譯器自動產生 IDisposable

  • 避免使用非參考成員,因為它們會導致編譯器自動產生 IDisposable

  • 避免使用完成項,但如果您要加入完成項,請隱藏建置警告並從 (On)(Begin)Close (和/或 OnAbort) 呼叫 SuppressFinalize(Object) 和完成項本身,以模擬原本可能自動產生的 IDisposable 行為。

給實施者的注意事項

當您繼承自 Message 時,您必須覆寫下列成員:HeadersVersion

建構函式

Message()

初始化 Message 類別的新執行個體。

屬性

Headers

在衍生類別中覆寫時,會取得訊息的標頭。

IsDisposed

傳回值,指出是否已處置 Message

IsEmpty

傳回值,指出 Message 是否為空白。

IsFault

取得值,指出這個訊息是否會產生任何的 SOAP 錯誤。

Properties

在衍生類別中覆寫時,會取得一組訊息的處理層級附註。

State

取得這個 Message 的目前狀態。

Version

在衍生類別中覆寫時,會取得訊息的 SOAP 版本。

方法

BeginWriteBodyContents(XmlDictionaryWriter, AsyncCallback, Object)

開始非同步寫入訊息本文的內容。

BeginWriteMessage(XmlDictionaryWriter, AsyncCallback, Object)

開始非同步寫入整個訊息。

Close()

關閉 Message 並釋放所有資源。

CreateBufferedCopy(Int32)

將整個 Message 儲存到記憶體緩衝區中,以供未來存取。

CreateMessage(MessageVersion, FaultCode, String, Object, String)

建立包含 SOAP 錯誤、錯誤的原因和詳細資料、版本和動作的訊息。

CreateMessage(MessageVersion, FaultCode, String, String)

建立包含 SOAP 錯誤、錯誤的原因、版本和動作的訊息。

CreateMessage(MessageVersion, MessageFault, String)

建立包含 SOAP 錯誤、版本和動作的訊息。

CreateMessage(MessageVersion, String)

建立包含版本和動作的訊息。

CreateMessage(MessageVersion, String, BodyWriter)

使用由位元組陣列組成的本文來建立訊息。

CreateMessage(MessageVersion, String, Object)

使用指定的版本、動作和本文建立訊息。

CreateMessage(MessageVersion, String, Object, XmlObjectSerializer)

使用指定的版本、動作、訊息本文和序列化程式建立訊息。

CreateMessage(MessageVersion, String, XmlDictionaryReader)

使用指定的版本、動作和本文建立訊息。

CreateMessage(MessageVersion, String, XmlReader)

使用指定的讀取器、動作和版本建立訊息。

CreateMessage(XmlDictionaryReader, Int32, MessageVersion)

使用指定的讀取器、動作和版本建立訊息。

CreateMessage(XmlReader, Int32, MessageVersion)

使用指定的讀取器、動作和版本建立訊息。

EndWriteBodyContents(IAsyncResult)

結束非同步寫入訊息主體的內容。

EndWriteMessage(IAsyncResult)

結束非同步寫入整個訊息。

Equals(Object)

判斷指定的物件是否等於目前的物件。

(繼承來源 Object)
GetBody<T>()

擷取這個 Message 執行個體的本文。

GetBody<T>(XmlObjectSerializer)

使用指定的序列化程式來擷取這個 Message 的本文。

GetBodyAttribute(String, String)

擷取訊息本文的屬性。

GetHashCode()

做為預設雜湊函式。

(繼承來源 Object)
GetReaderAtBodyContents()

取得會存取此訊息之本文內容的 XML 字典讀取器。

GetType()

取得目前執行個體的 Type

(繼承來源 Object)
MemberwiseClone()

建立目前 Object 的淺層複製。

(繼承來源 Object)
OnBeginWriteBodyContents(XmlDictionaryWriter, AsyncCallback, Object)

訊息開始寫入訊息內容時引發事件。

OnBeginWriteMessage(XmlDictionaryWriter, AsyncCallback, Object)

引發開始撰寫整封郵件的事件。

OnBodyToString(XmlDictionaryWriter)

在訊息本文轉換成字串時呼叫。

OnClose()

在訊息關閉時呼叫。

OnCreateBufferedCopy(Int32)

在建立訊息緩衝區以儲存此訊息時呼叫。

OnEndWriteBodyContents(IAsyncResult)

完成寫入郵件本文內容時引發事件。

OnEndWriteMessage(IAsyncResult)

完成寫入整封郵件時引發事件。

OnGetBody<T>(XmlDictionaryReader)

在擷取訊息本文時呼叫。

OnGetBodyAttribute(String, String)

在擷取訊息本文的屬性時呼叫。

OnGetReaderAtBodyContents()

在擷取存取此訊息之本文內容的 XML 字典讀取器時呼叫。

OnWriteBodyContents(XmlDictionaryWriter)

在訊息本文寫入至 XML 檔案時呼叫。

OnWriteMessage(XmlDictionaryWriter)

在整個訊息寫入至 XML 檔案時呼叫。

OnWriteStartBody(XmlDictionaryWriter)

在開始本文寫入至 XML 檔案時呼叫。

OnWriteStartEnvelope(XmlDictionaryWriter)

在開始封套寫入至 XML 檔案時呼叫。

OnWriteStartHeaders(XmlDictionaryWriter)

在開始標頭寫入至 XML 檔案時呼叫。

ToString()

傳回表示目前 Message 執行個體的字串。

WriteBody(XmlDictionaryWriter)

使用指定的 XmlDictionaryWriter 寫入本文項目。

WriteBody(XmlWriter)

使用指定的 XmlWriter 序列化訊息本文。

WriteBodyContents(XmlDictionaryWriter)

使用指定的 XmlDictionaryWriter 序列化本文內容。

WriteMessage(XmlDictionaryWriter)

使用指定的 XmlDictionaryWriter 序列化整個訊息。

WriteMessage(XmlWriter)

使用指定的 XmlWriter 序列化整個訊息。

WriteStartBody(XmlDictionaryWriter)

使用指定的 XmlDictionaryWriter 序列化訊息的開始本文。

WriteStartBody(XmlWriter)

使用指定的 XmlDictionaryWriter 序列化訊息的開始本文。

WriteStartEnvelope(XmlDictionaryWriter)

使用指定的 XmlDictionaryWriter 序列化開始封套。

明確介面實作

IDisposable.Dispose()

關閉此訊息使用的所有資源。 這個方法無法被繼承。

擴充方法

ToHttpRequestMessage(Message)

HttpRequestMessage 執行個體建立 Message 執行個體。

ToHttpResponseMessage(Message)

HttpResponseMessage 執行個體建立 Message 執行個體。

適用於