SoapExtension 類別

定義

XML Web Service 的 SOAP 擴充的基底類別,使用 ASP.NET 所建立的。

C#
public abstract class SoapExtension
繼承
SoapExtension

範例

下列 TraceExtension SOAP 延伸模組會在套用至 XML Web 服務方法時,將 SOAP 要求和 SOAP 回應輸出至指定的檔案。 如果已安裝下列 SOAP 擴充功能以使用 XML Web 服務執行,ASPNET 使用者帳戶必須具有寫入記錄檔之目錄的許可權。

C#
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
using System.Net;

    // Define a SOAP Extension that traces the SOAP request and SOAP
    // response for the XML Web service method the SOAP extension is
    // applied to.

    public class TraceExtension : SoapExtension
    {
        Stream oldStream;
        Stream newStream;
        string filename;

        // Save the Stream representing the SOAP request or SOAP response into
        // a local memory buffer.
        public override Stream ChainStream( Stream stream )
        {
            oldStream = stream;
            newStream = new MemoryStream();
            return newStream;
        }

        // When the SOAP extension is accessed for the first time, the XML Web
        // service method it is applied to is accessed to store the file
        // name passed in, using the corresponding SoapExtensionAttribute.	
        public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
        {
            return ((TraceExtensionAttribute) attribute).Filename;
        }

        // The SOAP extension was configured to run using a configuration file
        // instead of an attribute applied to a specific XML Web service
        // method.
        public override object GetInitializer(Type WebServiceType)
        {
            // Return a file name to log the trace information to, based on the
            // type.
            return "C:\\" + WebServiceType.FullName + ".log";
        }

        // Receive the file name stored by GetInitializer and store it in a
        // member variable for this specific instance.
        public override void Initialize(object initializer)
        {
            filename = (string) initializer;
        }

        //  If the SoapMessageStage is such that the SoapRequest or
        //  SoapResponse is still in the SOAP format to be sent or received,
        //  save it out to a file.
        public override void ProcessMessage(SoapMessage message)
        {
            switch (message.Stage)
            {
                case SoapMessageStage.BeforeSerialize:
                    break;
                case SoapMessageStage.AfterSerialize:
                    WriteOutput(message);
                    break;
                case SoapMessageStage.BeforeDeserialize:
                    WriteInput(message);
                    break;
                case SoapMessageStage.AfterDeserialize:
                    break;
            }
        }

        public void WriteOutput(SoapMessage message)
        {
            newStream.Position = 0;
            FileStream fs = new FileStream(filename, FileMode.Append,
                FileAccess.Write);
            StreamWriter w = new StreamWriter(fs);

            string soapString = (message is SoapServerMessage) ? "SoapResponse" : "SoapRequest";
            w.WriteLine("-----" + soapString + " at " + DateTime.Now);
            w.Flush();
            Copy(newStream, fs);
            w.Close();
            newStream.Position = 0;
            Copy(newStream, oldStream);
        }

        public void WriteInput(SoapMessage message)
        {
            Copy(oldStream, newStream);
            FileStream fs = new FileStream(filename, FileMode.Append,
                FileAccess.Write);
            StreamWriter w = new StreamWriter(fs);

            string soapString = (message is SoapServerMessage) ?
                "SoapRequest" : "SoapResponse";
            w.WriteLine("-----" + soapString +
                " at " + DateTime.Now);
            w.Flush();
            newStream.Position = 0;
            Copy(newStream, fs);
            w.Close();
            newStream.Position = 0;
        }

        void Copy(Stream from, Stream to)
        {
            TextReader reader = new StreamReader(from);
            TextWriter writer = new StreamWriter(to);
            writer.WriteLine(reader.ReadToEnd());
            writer.Flush();
        }
    }

    // Create a SoapExtensionAttribute for the SOAP Extension that can be
    // applied to an XML Web service method.
    [AttributeUsage(AttributeTargets.Method)]
    public class TraceExtensionAttribute : SoapExtensionAttribute
    {

        private string filename = "c:\\log.txt";
        private int priority;

        public override Type ExtensionType
        {
            get { return typeof(TraceExtension); }
        }

        public override int Priority
        {
            get { return priority; }
            set { priority = value; }
        }

        public string Filename
        {
            get
            {
                return filename;
            }
            set
            {
                filename = value;
            }
        }
    }

備註

ASP.NET 可透過擴充性機制來建置 SOAP 相關的基礎結構。 ASP.NET SOAP 擴充功能架構會圍繞擴充功能,在用戶端或伺服器上訊息處理的特定階段檢查或修改訊息。

ASP.NET SOAP 延伸模組衍生自 SoapExtension 類別。 GetInitializerInitialize 方法提供替代機制來初始化 SOAP 擴充功能,以增強效能。 ProcessMessage 是大部分 SOAP 延伸模組的核心,因為 方法會在 中 SoapMessageStage 定義的每個階段呼叫,讓 SOAP 延伸模組能夠執行該特定 SOAP 延伸模組所需的行為。 針對需要修改 SOAP 要求或 SOAP 回應的 SOAP 延伸模組, ChainStream 提供機會接收透過網路傳送的建議資料。

建構函式

SoapExtension()

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

方法

ChainStream(Stream)

當在衍生類別中覆寫時,允許對包含 SOAP 要求或回應之記憶體緩衝區的 SOAP 擴充存取。

Equals(Object)

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

(繼承來源 Object)
GetHashCode()

做為預設雜湊函式。

(繼承來源 Object)
GetInitializer(LogicalMethodInfo, SoapExtensionAttribute)

當在衍生類別中覆寫時,允許 SOAP 擴充耗用一次效能,使用套用至 XML Web Service 方法的屬性來初始化 XML Web Service 方法所特有的資料。

GetInitializer(Type)

當在衍生類別中覆寫時,允許 SOAP 擴充耗用一次效能來初始化實作 XML Web Service 之類別所特有的資料。

GetType()

取得目前執行個體的 Type

(繼承來源 Object)
Initialize(Object)

當在衍生類別中覆寫時,允許 SOAP 擴充使用 GetInitializer(LogicalMethodInfo, SoapExtensionAttribute) 方法中快取的資料來初始化其本身。

MemberwiseClone()

建立目前 Object 的淺層複製。

(繼承來源 Object)
ProcessMessage(SoapMessage)

當在衍生類別中覆寫時,允許 SOAP 擴充接收要在每個 SoapMessage 處理的 SoapMessageStage

ToString()

傳回代表目前物件的字串。

(繼承來源 Object)

適用於

產品 版本
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1

另請參閱