在应用别人接口的时候,总是要用签名,很是不理解签名这是怎么知道做的。通过对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. C# Winform下一个热插拔的MIS/MRP/ERP框架(通用控件)

    一直对商业控件不感冒, 结合日常工作, 我写了几个常用控件. 一.下拉框控件(仿Access下拉框:F4下拉,自动输入,支持单/多列显示),可在Datagridview中使用. 1.常规: 2.Dat ...

  2. 18.阻止默认操作e.preventDefault();防止冒泡事件:e.stopPropagation()

      一.加了e.preventDefault();会阻止a标签默认的点击跳转效果 <!DOCTYPE html> <html lang="en"> < ...

  3. ArcGIS10.4破解

    arcgis 10.4破解方法 *注意!Desktop,Engine,Server必须为同一版本* Engine10.4破解失败,SDE10.4未进行破解 1.先安装License10.4 2.再安装 ...

  4. PyQt 5+qtDesigner

    https://blog.csdn.net/view994/article/details/84402069 https://blog.csdn.net/yizhou2010/article/deta ...

  5. vue 子页面,向父页面 传值...

    子组件 通过 事件 向父组件传值..... 父组件 方法: methods: { appendData: function (list) { console.log(list); for (var i ...

  6. python-repr()和val()函数

    1. repr() 函数将对象转化为供解释器读取的形式. 语法 以下是 repr() 方法的语法: repr(object) 参数 object -- 对象. 返回值 返回一个对象的 string 格 ...

  7. 兼容 火狐、IE 的中a标签用 javascript:void(0); 依然执行跳转的问题

    <a onclick="return false;" href="javascript: void(0)" target="_blank&quo ...

  8. [转] 用javascript修改css伪类的几种方法

    用javascript修改css伪类的几种方法: Modify pseudo element styles with JavaScript http://pankajparashar.com/post ...

  9. Python入门笔记——(2)列表和元组

    一.序列 python包含6种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.序列中每个元素被分配一个序号即索引,第一个索引为0,第二个为1,以此类推.也可以 ...

  10. opatch on-line patch and standby-fisrt patch

    opatch on-line patch and standby-fisrt patch on-line patch 有缺陷,不建议使用,standby-fisrt patch 可以考虑使用 #### ...