Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 记录我的Web服务的soap扩展_.net_Asp.net_Web Services_Soap_Soap Extension - Fatal编程技术网

.net 记录我的Web服务的soap扩展

.net 记录我的Web服务的soap扩展,.net,asp.net,web-services,soap,soap-extension,.net,Asp.net,Web Services,Soap,Soap Extension,我使用此soap扩展来跟踪我的Web服务: using System; using System.IO; using System.Web.Services.Protocols; namespace MyLibrary.MySystem { // Define a SOAP Extension that traces the SOAP request and SOAP // response for the XML Web service method the SOAP e

我使用此soap扩展来跟踪我的Web服务:

using System;
using System.IO;
using System.Web.Services.Protocols;

namespace MyLibrary.MySystem
{
     // 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 WebServicesTraceExtension : 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;
                default:
                    throw new Exception("invalid stage");
            }
        }

        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(WebServicesTraceExtension); }
        }

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

        public string Filename
        {
            get
            {
                return filename;
            }
            set
            {
                filename = value;
            }
        }
    }
}
在my web.config中:

<webServices>
      <soapExtensionTypes>
        <add type="MyLibrary.MySystem.WebServicesTraceExtension, MyLibrary.MySystem"
             priority="1" group="0" />
      </soapExtensionTypes>
    </webServices>

当我执行web服务并在soap扩展上设置断点时,什么也没发生。 我将webservices与json一起使用,而不是与xml一起使用。
如何使此soap扩展工作?

您不能将
SoapExtension
用于
ScriptService
(我猜您是在使用ScriptService返回JSON)
SoapExtension
按名称仅用于SOAP处理。改为使用自定义
IHttpModule

编辑:


实际上,您的。

可能与感谢重复,我没有意识到使用xml的Web服务使用的是soap,而使用json的Web服务使用的是ScriptService。我也不知道SoapExtension不适用于ScriptService。