• 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所在的程序集名称。本人之前在做的时候因为对这个不懂,在这个问题上花费了好多时间,所以在这说明一下,帮助大家理解学习

  • 相关阅读:
    帮人“解封微信”犯法?全国首例!判刑!
    热乎的校招面经试题解析——百度篇
    字节跳动入局在线教育:烧钱、亏钱
    TF-IDF 算法介绍
    Django ORM 常见查询条件
    Django中render和render_to_response的区别
    Python异步操作MongoDB --Motor的使用
    Java 如何抛出异常、自定义异常
    java项目中的classpath到底是什么
    maven里的modelVersion
  • 原文地址:https://www.cnblogs.com/gracegeng/p/5990346.html
Copyright © 2020-2023  润新知