0

为了尝试优雅地处理来自 ajax 的重定向,我遵循了此防止表单身份验证。但是,我需要能够确定某些属性是否正在装饰进行此调用的操作,因为我只想在某些情况下这样做。我可以从可以在此方法中访问的HttpRequest对象中获取此信息吗?

基本上从上面的代码中提取了我想要操作的部分:

public class SuppressFormsAuthenticationRedirectModule : IHttpModule {

  private void OnPostReleaseRequestState(object source, EventArgs args) {
      var context = (HttpApplication)source;
      var response = context.Response;
      var request = context.Request; // request is HttpRequest

      if (response.StatusCode == 401 && request.Headers["X-Requested-With"] == 
        "XMLHttpRequest") {

        // TODO HERE:  Check that the controller action contains a particular attribute
        //             and if so do not suppress redirect
        SuppressAuthenticationRedirect(context.Context);
      }
  }
  }

更新:可能值得注意的是,此代码保存在已编译的 DLL 项目中,然后合并到主机 MVC 应用程序中(我们无权访问)。在这种情况下,除非我可以确保它不会影响应用程序中的其余控制器,否则我实际上无法更改默认实现。

4

1 回答 1

1

我尝试尽可能多地使用框架,这就是我选择从 DefaultControllerFactory 公开 GetControllerType 方法的原因。您会注意到 routeData 包含区域、控制器和操作,因此通过一些反思,您可以绕过必须创建派生控制器工厂。

这绝对不是生产准备好的。这只是从请求的操作中获取自定义属性的一种方式。

编辑:不是设置当前控制器工厂,而是创建一个新的 DerivedControllerFactory

var httpApplication = (HttpApplication)sender;
var httpContext = new HttpContext(httpApplication.Request, new HttpResponse(new StringWriter()));
var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
//var factory = ControllerBuilder.Current.GetControllerFactory() as DerivedControllerFactory;
var factory = new DerivedControllerFactory();
var controllerType = factory.GetControllerType(new RequestContext(new HttpContextWrapper(httpContext), routeData), routeData.Values["controller"].ToString());
var methodInfo = controllerType.GetMethod(routeData.Values["action"].ToString());
var attributes = methodInfo.GetCustomAttributes(true);  

public class DerivedControllerFactory : DefaultControllerFactory
{
   public new Type GetControllerType(RequestContext requestContext, string controllerName)
   {
      return base.GetControllerType(requestContext, controllerName);
   }
}
于 2012-12-07T16:47:06.117 回答