2012-12-06 43 views
0

爲了嘗試和優雅地處理來自ajax的重定向,我遵循此Prevent Forms authentication。但是,我需要能夠確定某些屬性是否正在裝飾此調用的操作,因爲我只想在某些場合執行此操作。我可以從HttpRequest對象中獲取此方法的信息嗎?如何檢查來自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); 
     } 
    } 
    } 

UPDATE: 這或許值得注意的是,此代碼編譯DLL項目,然後將其encorporated進入宿主內舉行MVC應用程序(我們無法訪問)。在這種情況下,除非我能確保它不影響應用程序中的其他控制器,否則我實際上沒有訪問權限來更改默認實現。

回答

1

我試圖儘可能多地使用框架,這就是爲什麼我選擇從DefaultControllerFactory公開GetControllerType方法的原因。您會注意到,routeData包含區域,控制器和操作,因此稍加反思就可以繞過必須創建派生控制器工廠。

這絕對不是生產準備。這只是a方式從請求的操作獲取自定義屬性。

編輯:而不是設置電流控制器工廠,創建一個新的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); 
    } 
} 
+0

乾杯巴里。它絕對看起來像一個選項。不幸的是,這個代碼是共享應用程序的一部分,所以我會對更改默認控制器工廠感到厭倦,除非我能確保它隻影響我擁有的控制器....我不確定這是否可行? – dreza

+0

我修改了上面的代碼以避免必須設置當前控制器工廠。 – barry