1. 程式人生 > >C# 給 webservice 增加日誌.

C# 給 webservice 增加日誌.

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; // } //} } }