实现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 < * * )
{
stream.Position = ;
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 = ;
}
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("", ,by,true)); Console.ReadKey();
}
}
}
6.web.config配置
<system.web>
<webServices>
<soapExtensionTypes>
<add type="WebApplication1.SimpleWSInvokeMonitorExtension,WebApplication1" priority=""/>
</soapExtensionTypes>
</webServices>
</system.web>
实现webservice过滤器,请求日志和权限等的更多相关文章
- cxf client在后台不通且chunk设置为false的时候不能在控制台输出请求日志
场景: 服务编排框架支持编排webservice服务.call webservice的client是基于cxf做的.为了使用服务编排的开发者调试与定位问题方便,需要将webservice的请求与响应报 ...
- Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...
- spring boot aop 自定义注解 实现 日志检验 权限过滤
核心代码: package com.tran.demo.aspect; import java.lang.reflect.Method; import java.time.LocalDateTime; ...
- 46. Spring Boot中使用AOP统一处理Web请求日志
在之前一系列的文章中都是提供了全部的代码,在之后的文章中就提供核心的代码进行讲解.有什么问题大家可以给我留言或者加我QQ,进行咨询. AOP为Aspect Oriented Programming的缩 ...
- 异常详细信息: System.Security.SecurityException: 未找到源,不过,未能搜索部分或所有事件日志。 若要创建源,您需要用于读取所有事件日志的权限以确保新的源名称是唯一的。 不可访问的日志: Security。
“/”应用程序中的服务器错误. 安全性异常 说明: 应用程序尝试执行安全策略不允许的操作.要授予此应用程序所需的权限,请与系统管理员联系,或在配置文件中更改该应用程序的信任级别. 异常详细信息: Sy ...
- 如何从Serilog请求日志记录中排除健康检查终结点
这是在ASP.NET Core 3.X中使用Serilog.AspNetCore系列文章的第四篇文章:. 第1部分-使用Serilog RequestLogging减少日志详细程度 第2部分-使用Se ...
- 用SignalR实现实时查看WebAPI请求日志
实现的原理比较直接,定义一个MessageHandler记录WebAPI的请求记录,然后将这些请求日志推送到客户端,客户端就是一个查看日志的页面,实时将请求日志展示在页面中. 这个例子的目的是演示如何 ...
- 其他信息: 未找到源,不过,未能搜索部分或所有事件日志。 若要创建源,您需要用于读取所有事件日志的权限以确保新的源名称是唯一的。 不可访问的日志: Security。
其他信息: 未找到源,不过,未能搜索部分或所有事件日志. 若要创建源,您需要用于读取所有事件日志的权限以确保新的源名称是唯一的. 不可访问的日志: Security. System.Diagnos ...
- nginx记录响应与POST请求日志
生产环境中的某些api出现故障,但是问题无法重现,但是又很想解决掉问题以及我们新项目上线,需要跟踪请求与响应的信息,可以预先找到一些bug,减少大面积的损失. 安装nginx与ngx_lua 响应日志 ...
随机推荐
- 软件测试之实际工作工作方式001--log4
软件测试之实际工作工作方式001--log4 Dotest软件测试-董浩整理 领导安排任务后: 1)首先要确认理解:是指的某工作吗?具体有什么要求吗?时间截止到什么时候? 解析: a.万一 ...
- 2018-2019-2 网络对抗技术 20165325 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165325 Exp3 免杀原理与实践 实验内容(概要) 一.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己 ...
- mac配置go使用gopm下载第三方包
打开zshrc文件 vim ~/.zshrc 输入变量 export GOPATH="/Users/chennan/go" #这个自定义 export GOBIN=$GOPATH/ ...
- ZOJ1008
题目: ZOJ 1008 分析: 重排矩阵, 虽然题目给的时间很多, 但是要注意剪枝, 把相同的矩阵标记, 在搜索时可以起到剪枝效果. Code: #include <bits/stdc++.h ...
- [转]PostgreSQL数据类型
第六章 数据类型 6.1概述 PostgreSQL 提供了丰富的数据类型.用户可以使用 CREATE TYPE 命令在数据库中创建新的数据类型.PostgreSQL 的数据类型被分为四种,分别是基本 ...
- 拦截请求并记录相应信息-springboot
方式: 1.FIlter过滤器 2.interceptor拦截器 3.Aspect切片 一.Filter过滤器形式 只能处理request中的数据 不能确定请求要走的是哪个controller信息 ...
- iOS开发之获取时间戳方法
// 得到当前本地时间,13位,整形 + (long long)gs_getCurrentTimeToMilliSecond { double currentTime = [[NSDate date] ...
- Java Swing 编程 JComboBox 实现模糊查找功能。
废话不多说,直接上代码.代码如下: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util ...
- L1-046 整除光棍 大数除法
L1-046 整除光棍(20 分) 这里所谓的"光棍",并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整 ...
- BZOJ2759 一个动态树好题 LCT
题解: 的确是动态树好题 首先由于每个点只有一个出边 这个图构成了基环内向树 我们观察那个同余方程组 一旦形成环的话我们就能知道环上点以及能连向环上点的值是多少了 所以我们只需要用一种结构来维护两个不 ...