C# 给 webservice 增加日志.
当然如果自己在WebService 代码里面手动写日志也不是不行. 反倒是容易理解.
但是为了框架式编程, 为了不侵入业务代码. 还是写成这种吧.
只需要在每个接口方法上面加上,就可以了

        [TraceLog]
        [WebMethod(Description = "获取申请单")]
        public string SetSqdxxToMkLis(string as_datatext)
        {
        	........
		}

源代码在下面.

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

namespace MK.AppCode.MVC.Filters
{

    /// <summary>
    /// 在所有的SOAP接口上面增加这个属性就可以了 [TraceLog]
    ///  Define a SOAP Extension that traces the SOAP request and SOAP
    /// response for the XML Web service method the SOAP extension is
    /// applied to. 
    /// </summary>

    public class SOAPTraceLog : SoapExtension
        {
        log4net.ILog log = log4net.LogManager.GetLogger("Application_BeginRequest");

        Stream oldStream;
        Stream newStream;
        string filename;
        Type WebServiceType;
        // 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 ((TraceLogAttribute)attribute).Filename;
            //return null;
            return AppDomain.CurrentDomain.BaseDirectory + "/log/soap.log";
        }

        // 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.
            this.WebServiceType = WebServiceType;
            return AppDomain.CurrentDomain.BaseDirectory + "/log/soap.log";
            //return null;
        }

        // 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) ? "出参" : "\r\n入参";
            //w.WriteLine("-----" + soapString + " at " + DateTime.Now);
            //w.Flush();
            //Copy(newStream, fs);
            //w.Close();

            TextReader reader = new StreamReader(newStream);
            var s = reader.ReadToEnd();
            //log.Debug("请求地址为:"+ message.Url + " 请求Action:" + message.Action +  " 出参为:" + s);
            log.Debug("出参为:" + s);

            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) ? "入参" : "出参";
            //w.WriteLine("-----" + soapString + " at " + DateTime.Now);
            //w.Flush();
            //newStream.Position = 0;
            //Copy(newStream, fs);
            //w.Close();
            //newStream.Position = 0;

            Copy(oldStream, newStream);
            //

            //string soapString = (message is SoapServerMessage) ? "\r\n入参" : "出参";
            //log.Debug(soapString); 

            newStream.Position = 0;
            //Copy(newStream, fs);
            //w.Close();
            TextReader reader = new StreamReader(newStream);
            var s = reader.ReadToEnd();
            log.Debug("请求地址为:" + message.Url);
            log.Debug("请求Action:" + message.Action);
            log.Debug("入参为:" + s);

            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 TraceLogAttribute : SoapExtensionAttribute
    {

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

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

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

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

}