Поделиться через


Листинг кода C# для образца класса библиотеки SQL трассировки SOAP

В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.

ПримечаниеПримечание

Инструкции по включению следующего образца кода библиотеки в проект Visual Studio приведены в разделе Добавление поддержки трассировки SOAP в клиентские приложения.

using System;using System.IO;using System.Web.Services.Protocols;using System.Threading;using System.Windows.Forms;using System.Xml;class info {    public void Init()     {        m_request = null;        m_requestException = null;        m_response = null;        m_responseException = null;    }    public string request     {        get { return m_request; }        set { m_request = value; }    }    public Exception requestException    {        get { return m_requestException; }        set { m_requestException = value; }    }    public string response    {        get { return m_response; }        set { m_response = value; }    }    public Exception responseException    {        get { return m_responseException; }        set { m_responseException = value; }    }    private string m_request = null;    private Exception m_requestException = null;    private string m_response = null;    private Exception m_responseException = null;}class snoop : SoapExtension {    public override object GetInitializer(LogicalMethodInfo lmi, SoapExtensionAttribute attr)     {        return getInfo();    }    public override object GetInitializer(Type type)    {        throw new NotImplementedException("snoop.GetInitializer is not implemented.");    }    public override void Initialize(object initializer)    {        m_info = (info) initializer;        m_info.Init();    }    public override void ProcessMessage(SoapMessage message)     {        SoapClientMessage client = (SoapClientMessage) message;        switch (client.Stage)         {            case SoapMessageStage.BeforeSerialize:                break;            case SoapMessageStage.AfterSerialize:                try                 {                    m_newStream.Position = 0;                    StreamReader reader = new StreamReader(m_newStream);                    m_info.request = FormatXml(reader.ReadToEnd());                    m_newStream.Position = 0;                    m_newStream.SetLength(0);                    StreamWriter writer = new StreamWriter(m_newStream);                    writer.Write(m_info.request);                    writer.Flush();                    Clipboard.SetDataObject(m_info.request+"\r\n",true);                }                catch (Exception e)                 {                    m_info.requestException = e;                }                m_newStream.Position = 0;                Copy(m_newStream,m_oldStream);                break;            case SoapMessageStage.BeforeDeserialize:                m_newStream.SetLength(0);                try                 {                    Copy(m_oldStream,m_newStream);                    m_newStream.Position = 0;                    StreamReader reader = new StreamReader(m_newStream);                    string tempData = reader.ReadToEnd();                    m_info.response = FormatXml(tempData);                    m_newStream.Position = 0;                    m_newStream.SetLength(0);                                    StreamWriter writer = new StreamWriter(m_newStream);                    writer.Write(tempData);                    writer.Flush();                    Clipboard.SetDataObject(m_info.request+"\r\n\r\n"+m_info.response+"\r\n",true);                }                catch (Exception e)                 {                    m_info.responseException = e;                }                m_newStream.Position = 0;                break;            case SoapMessageStage.AfterDeserialize:                break;            default:                throw new Exception("invalid stage");        }    }    public override Stream ChainStream(Stream stream)    {        m_oldStream = stream;        m_newStream = new MemoryStream();        return m_newStream;    }    private void Copy(Stream from, Stream to)     {        TextReader reader = new StreamReader(from);        TextWriter writer = new StreamWriter(to);        string data = reader.ReadToEnd();        writer.Write(data);        writer.Flush();    }    private string FormatXml(string xml)     {        XmlDocument inDoc = new XmlDocument();        inDoc.PreserveWhitespace = false;        inDoc.LoadXml(xml);        StringWriter writer = new StringWriter();        XmlTextWriter xmlWriter = new XmlTextWriter(writer);        xmlWriter.Formatting = Formatting.Indented;        inDoc.WriteContentTo(xmlWriter);        xmlWriter.Flush();        return writer.ToString();    }    private info m_info = null;    private Stream m_oldStream = null;    private Stream m_newStream = null;    //private Stream m_tempStream = null;        public static info getInfo()     {        object res = Thread.GetData(m_slot);        if (res == null)         {            res = new info();            Thread.SetData(m_slot,res);        }        return (info) res;    }    private static LocalDataStoreSlot m_slot = Thread.AllocateDataSlot();}[AttributeUsage(AttributeTargets.Method)]class snoopattribute : SoapExtensionAttribute {    public override Type ExtensionType    {        get { return typeof(snoop); }    }    public override int Priority     {        get { return m_priority; }        set { m_priority = value; }    }    private int m_priority = 0;}