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