WebService 信息拦截实现访问日志功能

webservice 实现拦截供其实相对比较简单,但是要获取拦截的信息我觉得是比较麻烦,之前因为对这个不懂也是查阅了很多资料才完成了这一块的功能。要实现这个功能就要实现抽象类:SoapExtension,重写:ProcessMessage方法。要实现获取比如:访问的方法名称,参数,返回值等信息就要重写:ChainStream方法.实现代码如下:

public class MsgSoapExtension : SoapExtension
{
Stream _requestStream;
Stream _responseStream;
XmlDocument _requestXml;
XmlDocument _reponseXml;
public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.AfterDeserialize:
break;
case SoapMessageStage.AfterSerialize:
_reponseXml = SetContentToXml(_responseStream);
CopyStream(_responseStream, _requestStream);
break;
case SoapMessageStage.BeforeDeserialize:
CopyStream(_requestStream, _responseStream);
_requestXml = SetContentToXml(_responseStream);
break;
case SoapMessageStage.BeforeSerialize:
break;
default:
break;
}
//throw new NotImplementedException();
}
public override System.IO.Stream ChainStream(System.IO.Stream stream)
{
_requestStream = stream;
_responseStream = new MemoryStream();
return _responseStream;
}
private void CopyStream(Stream requestStream, Stream responseStream)
{

TextReader reader = new StreamReader(requestStream);
TextWriter writer = new StreamWriter(responseStream);
writer.WriteLine(reader.ReadToEnd());
writer.Flush();
}

public XmlDocument SetContentToXml(Stream stream)
{
XmlDocument xml = new XmlDocument();
stream.Position = 0;
StreamReader reader = new StreamReader(stream);
xml.LoadXml(reader.ReadToEnd());
stream.Position = 0;
return xml;

}
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return null;
}

public override object GetInitializer(Type serviceType)
{
return null;
}
public override void Initialize(object initializer)
{
//throw new NotImplementedException();
}
}

在webconfig文件中添加:

<webServices>
<soapExtensionTypes>
<add type="WebService.MsgSoapExtension,WebService" priority="1" group="High"/>
</soapExtensionTypes>
</webServices>

这样就能实现拦截可以获取到webservice 相关信息,我这边通过将流写入到xml然后再读取xml获取到自己想要的信息,实现webservice 的访问日志功能

图中:WebService为类MsgSoapExtension所在的程序集名称。本人之前在做的时候因为对这个不懂,在这个问题上花费了好多时间,所以在这说明一下,帮助大家理解学习

posted @ 2016-10-23 16:53  GraceGeng208  阅读(2189)  评论(0编辑  收藏  举报