实现webservice过滤器,请求日志和权限等

过滤webservice的请求日志,做权限验证功能等。

1.

namespace WebApplication1
{
    public class SimpleWSInvokeMonitorExtension : SoapExtension
    {
        Stopwatch stopWatch = null;
        string startLoginfo = "";

        public override Stream ChainStream(Stream stream)
        {
            return stream;
        }
        public override object GetInitializer(Type serviceType)
        {
            //throw new NotImplementedException();
            return null;
        }

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

        public override void Initialize(object initializer)
        {
            //throw new NotImplementedException();
        }

        public override void ProcessMessage(SoapMessage message)
        {
            switch (message.Stage)
            {
                case SoapMessageStage.BeforeSerialize:
                    break;
                case SoapMessageStage.AfterSerialize:
                    stopWatch.Stop();
                    var sec = stopWatch.ElapsedMilliseconds;
                    string endLogInfo = string.Format("{0},总花费时间{1}ms,请求ip{2}",
                        startLoginfo,
                        stopWatch.ElapsedMilliseconds.ToString(),
                        GetClientIp());

                    break;
                case SoapMessageStage.BeforeDeserialize:
                    break;
                //about to call method;
                case SoapMessageStage.AfterDeserialize:
                    CertficateSoap(message);
                    string soapMessage = string.Empty;
                    var stream = message.Stream;
                    // Just making sure again that we have got a stream which we
                    // can read from AND after reading reset its position
                    //------------------------------------------------------------
                    if (stream.CanRead && stream.CanSeek && stream.Length < 10 * 1024 * 1024)
                    {
                        stream.Position = 0;
                        StreamReader rdr = new StreamReader(stream);
                        soapMessage = rdr.ReadToEnd();

                        // IMPORTANT!! - Set the position back to zero on the original
                        // stream so that HTTP pipeline can now process it
                        //------------------------------------------------------------
                        stream.Position = 0;
                    }
                    startLoginfo = GetStartLogInfo(soapMessage, message.MethodInfo.Name);
                    //采集时间
                    stopWatch = new Stopwatch();
                    stopWatch.Start();
                    break;
            }

        }
        /// <summary>
        /// 权限验证
        /// </summary>
        /// <param name="message"></param>
        public void CertficateSoap(SoapMessage message)
        {
            if (message.MethodInfo.CustomAttributeProvider.IsDefined(typeof(AllAnonymous), false))
                return;

            bool check = false;
            foreach (SoapHeader header in message.Headers)
            {
                if (header is CertficateSoapHeader)
                {
                    CertficateSoapHeader myHeader = (CertficateSoapHeader)header;

                    if (myHeader.UserName == null || myHeader.PassWord == null)
                    {
                        break;
                    }

                    if (myHeader.UserName.Equals("LY") && myHeader.PassWord.Equals("LY"))
                    {
                        check = true;
                        break;
                    }
                }
            }

            if (!check)
            {
                throw new SoapHeaderException(string.Format("认证失败{0}", message.MethodInfo.Name), SoapException.ClientFaultCode);
            }
        }
        public string GetStartLogInfo(string soapMessage, string methodName)
        {
            XDocument doc = XDocument.Parse(soapMessage);
            var body = doc.Descendants().Where(p => p.Name.LocalName == methodName).First();
            StringBuilder sb = new StringBuilder();
            foreach (XElement el in body.Nodes())
            {
                sb.Append(string.Format("{0}:{1},", el.Name.LocalName, el.Value));
            }
            string strLog = string.Format("外部系统请求方法:开始时间{0},方法{1},参数{2}", DateTime.Now.ToString(), methodName, sb.ToString());
            return strLog;
        }
        private static string GetClientIp(string ip = null)
        {
            if (String.IsNullOrEmpty(ip))
            {
                ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            }
            if (String.IsNullOrEmpty(ip) || ip.Equals("unknown", StringComparison.OrdinalIgnoreCase))
            {
                ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            }
            if (ip == "::1")
                ip = "127.0.0.1";
            return ip;
        }
    }
}

2.在服务端的公开方法增加特性

 /// <summary>
    /// BotWebService 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    //[ExtensionAttribute]
    [ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
    // [System.Web.Script.Services.ScriptService]

    public class BotWebService : System.Web.Services.WebService
    {
        public CertficateSoapHeader soapHeader;
        [WebMethod(Description = "")]
        [SoapHeader("soapHeader", Direction = SoapHeaderDirection.In)]
        //[AllAnonymous] 有特性表示不需要验证权限,没就需要
        public string GetString(string name,int age,byte[] remark,bool isfalg)
        {
            return name + age;
        }
}

3.

    /// <summary>
    /// 该特性表示该方法不需要验证调用者的信息
    /// </summary>
    [AttributeUsage(AttributeTargets.Method,AllowMultiple = true,Inherited = false)]
    public class AllAnonymous:Attribute
    {

    }

4.

namespace WebApplication1
{
    /// <summary>
    /// 用于webservice认证
    /// </summary>
    public class CertficateSoapHeader : SoapHeader
    {
        /// <summary>
        /// 属性
        /// </summary>
        public string UserName { get; set; }
        public string PassWord { get; set; }

        public CertficateSoapHeader() { }
        /// <summary>
        /// 构造函数认证
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="passWord">密码</param>
        public CertficateSoapHeader(string userName, string passWord)
        {
            this.UserName = userName;
            this.PassWord = passWord;
        }
    }
}

5.client

class Program
    {
        static void Main(string[] args)
        {
            localhost.BotWebService s = new localhost.BotWebService();
            localhost.CertficateSoapHeader header = new localhost.CertficateSoapHeader();
            header.UserName = "LY";
            header.PassWord = "LY";

            s.CertficateSoapHeaderValue = header;
            var by = Encoding.UTF8.GetBytes("你好啊,ewqeqwewq");
            //Console.WriteLine(s.HelloWorld());

           Console.WriteLine(s.GetString("111", 1,by,true));

            Console.ReadKey();
        }
    }
}

6.web.config配置

 <system.web>
    <webServices>
      <soapExtensionTypes>
        <add type="WebApplication1.SimpleWSInvokeMonitorExtension,WebApplication1" priority="1"/>
      </soapExtensionTypes>
    </webServices>
 </system.web>
时间: 2024-11-07 04:57:54

实现webservice过滤器,请求日志和权限等的相关文章

cxf client在后台不通且chunk设置为false的时候不能在控制台输出请求日志

场景: 服务编排框架支持编排webservice服务.call webservice的client是基于cxf做的.为了使用服务编排的开发者调试与定位问题方便,需要将webservice的请求与响应报文打出来. 这个诉求不是很复杂加上LoggingInInterceptor(打印响应报文)与LoggingOutInterceptor(打印请求报文)两个拦截器即可. 好,开始考虑异常场景,当提供webservice的服务后台不通时,理论上也是应该可以打出请求报文的,但是在对cxf的client的h

Koa 请求日志打点工具

前一段时间开始搞优化后端 API 性能的事,发现根本无从下手,Kibana 中虽然有记一些简陋且零散的日志,但也瞅不出啥眉目来.总结了下是日志太少了,所以决定先搞搞日志的事,目标是记录 API 请求相关的日志,找出哪个接口慢,最好具体到哪个函数慢. 记日志必然要涉及日志打点,怎么做日志打点是个问题.如果直接在代码中插入日志打点代码不仅侵入性强而且工作量大,也不够灵活,于是考虑如何做智能的自动打点.我们石墨后端使用的 bay 框架(基于 [email protected] 二次开发,基本上你可以认

【apache2】apache2查看错误日志、请求日志

1.一般存储路径在 [ /var/log/apache2/ ]下面, 2.错误日志和请求日志 必须要进行定期清理. 清理完成后,必须重启apache  [  cd /  ;  service apache2 restart    ] 3.参考文章:http://blog.csdn.net/ty_hf/article/details/55504719 原文地址:https://www.cnblogs.com/xuzhengzong/p/8510162.html

SPRINGBOOT9--AOP的使用(本例展示统一处理Web请求日志)

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,比如常见的有: 打开数据库连接/关闭数据库连接.打开事务/关闭事务.记录日志等.基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效

nginx采集post请求日志

解决问题 1:业务系统以post方式上发请求日志,需要对日志进行采集分析: 解决方法: 1:可以安装 openresty 版本nginx: 2:可以使用官方nginx版本编译lua模块: nginx 版本: nginx -v nginx version: openresty/1.13.6.2 配置案例 日志配置 log_format post_format '$time_iso8601\t$remote_addr\t$http_user_agent\t$request\t$request_bod

springboot动态修改日志级别+权限认证

1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个敏感操作,最好不能暴露地址直接修改,所以我研究了下,把权限验证加上了 1.2. 解决 1.2.1. pom 首先加上pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>

Eclipse 查看 WebService 服务请求和响应消息

每个WebService 对入参和返参都是有自己的要求的:别人调用我的WebService,需要按照我的要求进行传参.当我返回数据时,我也得告诉别人,我的返回数据是怎样组织的,方便别人读取. 那怎样查看这种规则?下面介绍两种方式查看 WebService 服务请求和响应消息. 第一种方式:利用Eclipse的Web Services Explorer 第一步:切换成 JavaEE 模式 第二步:点击如下图所示的工具栏菜单 第三步:弹出如下页面,选择页面右上角的 WSDL Page,点击 WSDL

SpringBoot2.0 使用AOP统一处理Web请求日志(完整版)

一,加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 二,在src/main/java下的某个包中新建类 : import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Proce

SpringBoot使用AOP记录请求日志和异常日志

本文基础WEB环境使用SpringBoot及Spring-Data-Jpa构建 关于SpringBoot及JPA用法本文不再过多讨论,下面是引入的jar: 起步依赖 web及aop依赖 jpa依赖 mysql驱动 本文着重AOP的使用,你也可以使用自己构建的环境 由于本文中使用的JPA,因此首先创建保存日志及保存异常的实体类,如果你使用的是Mybatis,则需要首先创建表然后根据表来逆向生成实体类 保存日志的实体类: 日志实体 保存异常的实体类: 异常实体 接下来我们定义一个Operation注