在应用别人接口的时候,总是要用签名,很是不理解签名这是怎么知道做的。通过对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应用:类签名的更多相关文章

  1. C# System.Attribute(验证类)

    本文以一个项目中通用的验证类来举例说明如何使用自定义Attribute来扩展元数据.  在项目中,我们为了保证各个层次之间的松藕合,通常把在各个层次之间传递数据的封装在一个称为实体类的类中,比如Act ...

  2. IDEA配置类签名

  3. 使用TypeDescriptor给类动态添加Attribute

    给类动态添加Attribute一直是我想要解决的问题,从msdn里找了很久,到Stack Overflow看了不少文章,算是最终有了答案. 先是有这样的一段解释 Attributes are stat ...

  4. 使用TypeDescriptor给类动态添加Attribute【转】

    源文 : http://www.cnblogs.com/bicker/p/3326763.html 给类动态添加Attribute一直是我想要解决的问题,从msdn里找了很久,到Stack Overf ...

  5. MSIL实用指南-给字段、属性、方法、类、程序集加Attribute

    C#编程中可以给字段.方法.类以及程序集加特性即继承于Attribute的类.这里讲解怎么在IL中给它们加上特性. 生成字段的对应的类是FieldBuilder,生成属性的对应的类是PropertyB ...

  6. 理解Attribute

    注:本文转载自http://kb.cnblogs.com/page/87531/ Attribute与Property 的翻译区别 Attribute 一般译作“特性”,Property 仍然译为“属 ...

  7. AOP 面向切面编程, Attribute在项目中的应用

    一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...

  8. Attribute

    Attribute介绍 咱们来说Attribute,他是一个类,所以自定义的Attribute都是继承自System.Attribute,一般命名的时候都是以Attribute结尾.在使用的时候我们可 ...

  9. 通过声明Attribute属性改变不同类的输出效果

    ConsoleApplication--控制台应用程序 首先创建基类: using System; using System.Collections.Generic; using System.Lin ...

随机推荐

  1. winform datagridview某一列设为自动宽度

    如果用displayedcells只会使看见的数据自动列宽,滚动条往下发现后面的没有自动列宽,所以要用allcells就不会出现这个问题

  2. Python之路Python全局变量与局部变量、函数多层嵌套、函数递归

    Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...

  3. logging、hashlib、collections模块

    一.hashlib模块(加密模块) 1.什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 , ...

  4. TX2 默认root用户启动

    Jetpack3.1 修改方式 修改1 gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 修改后: 修改2 gedit /root/.pro ...

  5. window 安装 python

    官网地址下载安装包 点击下载 会自动识别你当前的系统,或者点击你需要安装的平台 或者选择其他版本 执行安装 高级选项说明: Install for all users 所有用户可使用 Associat ...

  6. Codeforces - 617E 年轻人的第一道莫队·改

    题意:给出\(n,m,k,a[1...n]\),对于每次询问,求\([l,r]\)中\(a[i] \ xor \ a[i+1] \ xor \ ...a[j],l<=i<=j<=r\ ...

  7. 通过CMD命令设置网络参数

    在微软的Windows系统中,一般情况下都是在可视化界面中设置IP地址和DNS的,进入“本地连接”->“属性”->“TCP/IP协议”,设置IP和DNS.但有些情况是没有这个权限的,比如在 ...

  8. Django ORM常用字段和参数

    常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围 ...

  9. PIE SDK点元素的绘制

    1. 功能简介 在数据的处理中会用到点元素的绘制,目前PIE SDK支持IMarkerSymbol的点元素的绘制,MarkerSymbol对象是用于修饰点状对象的符号,它包括ArrowMarkerSy ...

  10. PIE SDK应用掩膜

    1.算法功能简介 当对一幅图像应用掩膜时, 1 值的区域被保留, 0 值的区域被舍弃( 1 值区域被处理, 0 值区域被屏蔽不参与计算). PIE SDK支持算法功能的执行,下面对应用掩膜算法功能进行 ...