实现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 响应日志 ...
随机推荐
- dubbo基本信息
1.Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目. 面试官问你如果这个都不清楚,那下面的就没必要问了. 官网: ...
- 如何使用npm构建一个react demo项目
方法一: 1) 安装node.js环境 点我进入nodejs官网 1.1) 下载LTS(Long term support)版本,安装 1.2) 在cmd中使用以下命令查看node是否安装成功 no ...
- Union 与 Union all 的区别【坑】
UNION操作符用于合并两个或多个SELECT语句的结果集 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必 ...
- C++简单交换堆排序的代码
下面的内容内容是关于C++简单交换堆排序的内容,应该对各位朋友有较大用途. { int start, end; { }} { int root, child; { if((child + 1 < ...
- trie上记忆化搜索,括号匹配——cf1152D好题!
一开始以为是卡特兰数的性质,,后来发现其实是dp,但是用记忆化搜索感觉更方便一点先来考虑字典树上的问题 设要求的序列长度是2n,我们用二元组(a,b)来表示前面长为a的序列中出现的 '(' - ')' ...
- foot
码云链接:https://gitee.com/zyyyyyyyyyyy/codes/rcfdzmin4a82v975pl1ko47 效果图: 原网站截图: 源代码: <!DOCTYPE html ...
- 2018年最新JAVA面试题总结之数据库(3)
转自于:https://zhuanlan.zhihu.com/p/39804394 1.MySQL的delete与truncate区别? 回答:delete语句执行删除的过程是每次从表中删除一行,并且 ...
- pwn学习(1)
0x00 简介 入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习. 0x01 保护方式 NX (DEP):堆栈不可 ...
- js数据结构与算法--双向链表的实现
双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向直接后继和直接前驱.所以,双向链表中的任意一个节点开始,都可以很方便的访问它的前驱节点和后继节点. 双向链表的实现 linke ...
- 用Java开发一个工具类,提供似于js中eval函数功能的eval方法
今天在看到<Java疯狂讲义>中一个章节习题: 开发一个工具类,该工具类提供一个eval()方法,实现JavaScript中eval()函数的功能--可以动态运行一行或多行程序代码.例如: ...