(MethodInfo) (new StackTrace().GetFrame(1).GetMethod() 是否可行??

解决方案 »

  1.   

    谢谢 timiil(小华) , 试了一下,有点启发。 可是只能获得当前堆栈的信息,而“SomeMethod" 还没有被执行,却还是找不到阿。
      

  2.   

    另一贴在http://community.csdn.net/Expert/topic/3543/3543035.xml?temp=.8970606
    请各位高人教育 阿!
      

  3.   

    使用StackTrace应该不可行
    自定义属性的类的构造函数和静态构造函数都不会被执行
    CLR也不是通过构造一个属性类的方法标识类型或者成员的但是timiil(小华)的方法可以得到被调用函数的信息
      

  4.   

    比如客户端代码:string a = SomeMethod();这个时候调用SomeMethod, 程序首先会执行MyAttribute(),因为MyAttribute这个属性被SomeMethod“订阅”了。 待执行完MyAttribute的处理后,才真的去执行SomeMethod。 现在的问题是如何在MyAttribute感知到“SomeMethod这个函数准备执行啦”这个“事件”的信息。
      

  5.   

    // 调用SomeMethod, 程序首先会执行MyAttribute()这个思路就不对
    [MyAttribute()]里头的东西应该是在编译阶段就固定了,直接写入程序集的PE头中
    运行时不会执行关于MyAttribute的任何代码
      

  6.   

    这也是为什么[MyAttribute()]里头括号内只能有常量的原因
    否则我们可以写出这样的代码:
    [MyAttribute(methodExcute())]
    假设MyAttribute类的构造函数接受一个参数的话
      

  7.   

    那为什么如下:
                      [WebMethod]
                      [SoapHeader("Token")]
    public string HelloWorld()
    {
         return this.Token.Value.ToString();
    }这个WebMethod被调用的时候,由客户端传入一个SOAP头的值(就是Token),而SOAPHeader(“Token”)不是起到了把值传给"this.Token" 中去么? 
      

  8.   

    "Token"直接被编译进程序集了,"Token"是常数
    如果是调用了一个方法,比如简单的[SoapHeader("Token".ToString())],代码将无法编译
      

  9.   

    我现在是做一个WebMethod的属性,系统得到这样的效果
    [SoapHeader("myToken")]
    [myPermission]
    [WebMethod]
    public string Hello()
    {
        return "hello";
    }其中,myToken记录的是客户端登陆后获取的令牌, 而myPermission负责监测myToken是否在当前的登陆Token Hash表中,并检查该Token所指向的用户是否有权限运行“Hello()”这个WebMethod,如果他有,就允许Hello()执行,否则就抛出AccessDeined的异常。现在,已经通过SOAPHeader属性获取了myToken了,剩下的问题是如何在myPermission这个属性中获取myToken的值了。 难度真的如 Sunmast所言,不可以在属性中这样做么?
      

  10.   

    你的myPermission是否继承于CodeAccessSecurityAttribute? 
    好像有点AOP的意思?好像又不是。
      

  11.   

    关于WebService的security
    MS提供了一整套机制,有专用的属性可以定制
      

  12.   

    因为要兼容系统非WebService部分的权限检测,所以不大敢用WSE2.0啊.
      

  13.   

    用不用WSE2倒是其次,偶感觉楼主关心的是用Attribute来作调用WebMethod的拦截器,不用显式地在每个WebMethod中CheckPermission
      

  14.   

    不是WSE
    好像WebService规范本身就有关于security的,嗯...
      

  15.   

    timiil(小华) 说的对,我就是用CodeAccessSecurityAttribute继承来的,主要是希望能在属性中把这事情解决了,不知道这也算AOP啦? :)
      

  16.   

    引用 Sunmast(速马|www.cpp-cli.org):
    "Token"直接被编译进程序集了,"Token"是常数
    如果是调用了一个方法,比如简单的[SoapHeader("Token".ToString())],代码将无法编译
    小弟水平低,但感觉上这里的"Token"的作用是把[客户端上传的SOAP的值,比如说"1234"吧,传递给当前类中一个[名叫“Token”]的变量中去, "Token"固然是常数,SoapHeader也当然是预编译的,但客户端上传的值确实是动态赋予的,也确实传送到了WebMethod所在Class中的this.Token这个变量中去。  不知道有没有理解错?