我已经按照这个Prevent Forms authentication来尝试优雅地处理从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应用程序(我们无权访问)。在这种情况下,我真的无法访问更改默认实现,除非我能确保它不会影响应用程序中的其余控制器。
答案 0 :(得分: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);
}
}