C# Attribute应用:类签名
在应用别人接口的时候,总是要用签名,很是不理解签名这是怎么知道做的。通过对Attribute的学习了解。大体可以用Attribute来做签名应用。
具体过程如下:
首先我们要先定义一个类,该类继承Attribute。该类主要最用是,签名需要用到的方法、参数和获取加密文件
public class CashiSongAttribute : Attribute
{
/// <summary>
/// 签名参数
/// </summary>
public string[] Param { get; set; }
/// <summary>
/// 是否签名
/// </summary>
public bool IsSign { get; set; }
/// <summary>
/// 加密文件
/// </summary>
/// <param name="bp"></param>
/// <param name="mi"></param>
/// <returns></returns>
public string ParamEncryption(BasePage bp,System.Reflection.MethodInfo mi)
{
if (Param != null && Param.Length > )
{
string md5 = "op" + mi.Name.ToLower();
foreach (string item in Param)
{
if (item.ToLower() == "op" || item.ToLower() == "sign")
continue;
md5 += item + bp.GetRequest(item);
}
byte[] bytestr = Encoding.Default.GetBytes(md5);
MD5 _md5 = new MD5CryptoServiceProvider();
byte[] bytesend = _md5.ComputeHash(bytestr);
return BitConverter.ToString(bytesend).Replace("-", "");
}
return "";
}
}
新建一个页面,在该页面创建一个方法,并加入该特性
[CashiSong(IsSign = true, Param = new string[] { "op", "name" })]
public string getceshicon()
{
return "签名成功!";
}
下面关键就再也通过调用方式的时候,验证参数是否都符合,加密文件是否正确。
创建一个基类BasePage,该基类主要负责,接受参数,并指定参数指定的方法,并判断签名信息是否正确。
这里会用到:System.Reflection.MethodInfo的应用、获取特性Attribute参数内容。
public class BasePage : Page
{
public BasePage()
{
this.Load += new EventHandler(BasePage_Load);
} void BasePage_Load(object sender, EventArgs e)
{
Response.AddHeader("Accept-Charset","UTF-8");
string op = GetRequest("op");
if (!string.IsNullOrEmpty(op))
{
System.Reflection.MethodInfo mi = this.GetType().GetMethod(op);
Attribute_Jude(mi);
}
this.Response.End();
}
/// <summary>
/// 签名判断
/// </summary>
/// <param name="mi"></param>
public void Attribute_Jude(MethodInfo mi)
{
MsgModel Msg = new MsgModel();
if (mi.IsDefined(typeof(CashiSongAttribute), false))
{
object[] attrs = mi.GetCustomAttributes(typeof(CashiSongAttribute), false);
CashiSongAttribute iplimit = (CashiSongAttribute)attrs[];
object responsestr=null;
if (iplimit != null && iplimit.Param.Length > )
{
string server_sign = GetRequest("sign");
string client_sign = iplimit.ParamEncryption(this, mi);
if (!server_sign.Equals(client_sign, StringComparison.OrdinalIgnoreCase)&&iplimit.IsSign)
{
Msg.msg = "Sing Error";
Msg.toile = ;
Send(Msg);
return;
}
responsestr = mi.Invoke(this, null);
}
Msg.toile = ;
Msg.msg = responsestr.ToString();
Send(Msg);
}
}
public void Send(MsgModel Msg)
{
Response.AddHeader("Content-type","applictaion/json");
JavaScriptSerializer javaScript = new JavaScriptSerializer();
string Con = javaScript.Serialize(Msg);
Response.Write(Con);
}
public string GetRequest(string key)
{
if (Request.QueryString[key] == null)
return "";
else
return Request.QueryString[key];
}
} public class MsgModel
{
public string msg { get; set; }
public int toile { get; set; }
}
获取特性参数内容的方法(CashiSongAttribute 为自定义特性类)
if (mi.IsDefined(typeof(CashiSongAttribute), false))
{
object[] attrs = mi.GetCustomAttributes(typeof(CashiSongAttribute), false);
CashiSongAttribute iplimit = (CashiSongAttribute)attrs[];
}
C# Attribute应用:类签名的更多相关文章
- C# System.Attribute(验证类)
本文以一个项目中通用的验证类来举例说明如何使用自定义Attribute来扩展元数据. 在项目中,我们为了保证各个层次之间的松藕合,通常把在各个层次之间传递数据的封装在一个称为实体类的类中,比如Act ...
- IDEA配置类签名
- 使用TypeDescriptor给类动态添加Attribute
给类动态添加Attribute一直是我想要解决的问题,从msdn里找了很久,到Stack Overflow看了不少文章,算是最终有了答案. 先是有这样的一段解释 Attributes are stat ...
- 使用TypeDescriptor给类动态添加Attribute【转】
源文 : http://www.cnblogs.com/bicker/p/3326763.html 给类动态添加Attribute一直是我想要解决的问题,从msdn里找了很久,到Stack Overf ...
- MSIL实用指南-给字段、属性、方法、类、程序集加Attribute
C#编程中可以给字段.方法.类以及程序集加特性即继承于Attribute的类.这里讲解怎么在IL中给它们加上特性. 生成字段的对应的类是FieldBuilder,生成属性的对应的类是PropertyB ...
- 理解Attribute
注:本文转载自http://kb.cnblogs.com/page/87531/ Attribute与Property 的翻译区别 Attribute 一般译作“特性”,Property 仍然译为“属 ...
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
- Attribute
Attribute介绍 咱们来说Attribute,他是一个类,所以自定义的Attribute都是继承自System.Attribute,一般命名的时候都是以Attribute结尾.在使用的时候我们可 ...
- 通过声明Attribute属性改变不同类的输出效果
ConsoleApplication--控制台应用程序 首先创建基类: using System; using System.Collections.Generic; using System.Lin ...
随机推荐
- 运行Scrapy工程,报错ModuleNotFoundError: No module named 'win32api'解决方法
1.运行爬虫scrapy crawl name,报错ScrpyModuleNotFoundError: No module named 'win32api' 2.解决方法: 在https://gith ...
- app.use和app.get的区别及解析
转载至:http://blog.csdn.net/wthfeng/article/details/53366169 写在前面:最近研究nodejs及其web框架express,对app.use和app ...
- pytest的一些你爱不释手的插件
1. pytest-html 安装: pip install pytest-html # 通过pip安装pytest-html 运行测试文件的时候,命令行加上对应参数即可 比如:pytest test ...
- jQuery 遍历 - closest() 方法
jQuery 遍历参考手册 实例 本例演示如何通过 closest() 完成事件委托.当被最接近的列表元素或其子后代元素被点击时,会切换黄色背景: $( document ).bind("c ...
- linux的目录和基本的操作命令
目录相关操作:( ctrl+l 清空当前的屏幕中的命令 ) 一:目录说明: . 当前目录.. 上一层目录- 前一个工作目录~ 当前[用户]所在的家目录 蓝色的文件: 都是目录 白 ...
- CF1012B Chemical table(构造)
[Luogu-CF1012B] 还有重题 P5089[eJOI2018]元素周期表 题解原话 : 可以发现这个过程是不改变二分图中的连通分量的个数的 答案就是 连通分量数-1 证明 : 设一行或一列为 ...
- 51nod - 1163 巧妙的并查集 O(1)维护区间
有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突 ...
- POJ - 3261 后缀数组 height应用
题意:求最少重叠\(k\)次的重复子串的最大长度 子串长度问题依然是二分枚举,可以观察出重叠的一定是sa排序中连续的 之前想出一种判断要\(n^2\)的方法,没有考虑到后面肯定会连续出现的情况 (大概 ...
- 1141 PAT Ranking of Institutions (25 分)
After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...
- npm install 卡住的时候的处理
[From] http://www.eguidedog.net/doc/what-to-do-when-npm-install-hangs.php 翻译一下,npm install 经常卡在下载某个包 ...