2

通常,在普通aspx文件中,我可以System.Attribute在页面开头使用,例如:

    [AuthorizePage()]
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }

    public class AuthorizePage : System.Attribute
    {
         public AuthorizePage()
         {
            //do some stuff to authorize
         }
    }

并且在页面初始化之前,属性的构造函数运行并做一些事情以确保一个人当前已登录,否则属性构造函数会将用户重定向到登录页面。

我想在HttpHandler(文件)上做同样的事情,但是在 ashx 页面上ashx该属性永远不会初始化。

[AuthorizePage()]
public class AjaxHandler : MuCustomClassBase, IHttpHandler, IReadOnlySessionState
{
     //The interface implementations and some other custom private methods
}

我对此ashx页面进行了 AJAX 调用。这可能是属性不运行的原因吗?还是我必须知道的其他事情?

最终,我会非常高兴知道如何在 ashx 文件上运行自定义 System.Attribute?

4

3 回答 3

3

假设您使用的是 ASP.Net 身份验证,您只需将 .ashx 添加到 web.config 中的受保护页面列表中,然后 IIS/ASP.Net 将处理其余部分:

  <location path="AjaxRequests.ashx">
    <system.web>
      <authorization>
        <allow users="?" />
      </authorization>
    </system.web>
  </location>

如果您使用的是自建身份验证方案,则可以OnProcessRequest在该方法中覆盖并执行必要的身份验证,并根据需要进行重定向。

于 2013-01-07T17:05:08.830 回答
2

属性本身不会做任何事情。你可以在一个类上堆放 10 个随机属性,但实际上什么都不会发生。属性仅提供有关类/方法/属性的元数据。

应该有一段代码可以查看元数据并对其进行操作。由于您似乎正在使用自定义AuthorizePageAttribute这样的代码片段,要么不为处理程序运行,要么不期望不是从 Page 派生的类具有这样的属性。

要解决问题,您需要找到处理您的自定义属性并修复它。您可能需要直接将类似的代码添加到您的处理程序。

您在属性构造函数中的代码在对该页面的每个请求都对页面类有用的事实听起来很可疑 - 我希望每个类型实例都创建一次这样的属性。依靠属性构造函数中的重要代码来运行类的每个实例对我来说似乎很危险。

于 2013-01-07T17:04:14.960 回答
1

首先,是的,您正在重新发明 Asp.Net MVC 中的 ActionFilterAttribute。但是,我不得不问你是否真的需要使用属性?我建议你使用继承模型。让我简单解释一下;您可能有一个 SecurePage : Page 实现安全操作的类。然后,您可以传递与派生页面相关的安全代码。

如果你坚持使用属性,你应该通过编写一个路由到所需处理程序的基本工厂处理程序来与处理程序机制相交。这个处理程序的行为应该像一个中介对象。

于 2013-01-08T11:01:34.760 回答