2014-07-26 72 views
-1

我已經創建了自己的控制器,其中我正在檢查每個請求,如果會話存在執行操作,否則重定向用戶登錄。控制器的單個實例不能用於處理多個請求

這裏是我的代碼:

public class DefaultController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Session["User"] == null) 
     { 
      filterContext.Result = RedirectToAction("Login", "Account"); 
     } 
     else 
     { 
      base.Execute(filterContext.RequestContext); 
     } 
    } 
} 

,我在我的控制器使用它:

public class HomeController : DefaultController 
{ 
    public ActionResult Index() 
    { 
     // DXCOMMENT: Pass a data model for GridView 
     return View();  
    } 
} 

,當我去首頁/指數它是根據重定向我LO-杜松子酒邏輯,但如果使用已經登錄(會話存在)它拋出異常,而不是執行該操作。

這裏是例外:

控制器的單個實例不能被用於處理多個請求。如果自定義控制器工廠正在使用中,請確保它爲每個請求創建控制器的新實例。

+0

您可以使用async await在其自己的線程中執行每個動作。如果您擁有最新的VS和.NET,請嘗試添加新的MVC/WebAPI項目,新的示例項目默認使用async/await。希望有所幫助。 – Brunis

+0

您應該在過濾器中編寫邏輯。 –

+0

@KhanhTO在這種情況下,我將不得不爲每個操作明確地修飾會話檢查,我需要更通用的,所以我這樣做 –

回答

2

在你OnActionExecution方法您正在執行的當前請求:base.Execute。框架稍後會執行並執行,因爲它不知道您已經執行了。

我從來沒有見過需要手動撥打Execute。不要這樣做。把OnActionExecuting想象成一個事件。你會得到一些事件的通知,可以掛鉤,但不應該修改框架的行爲方式。

+0

是的,你是對的我在你回答之前就明白了 –

0

授權是一個貫穿始終的問題。你應該把你的邏輯作爲一個過濾器來代替。

public class CustomAuthAttribute : FilterAttribute, IActionFilter { 

    public void OnActionExecuting(ActionExecutingContext filterContext) { 
     if (filterContext.HttpContext.Session["User"] == null) 
     { 
      filterContext.Result = new RedirectToRouteResult(
             new RouteValueDictionary 
             { 
             { "action", "Login" }, 
             { "controller", "Account" } 
             }); 
     } 
    } 
} 

並將其註冊爲全局過濾器,以防您需要將邏輯應用於所有控制器。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new CustomAuthAttribute()); 
} 

事實上,已經有一個內置的過濾器這項工作:http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new AuthorizeAttribute()); 
} 
+0

重寫內置過濾器怎麼樣 –

+0

@Ehsan Sajjad:關於重寫,已經有了一個stackoverflow答案:http://stackoverflow.com/questions/19358802/overriding-authorizeattribute-in-mvc-4 –

+0

@Ehsan Sajjad:I通常只需使用內置濾波器而不需要修改。 –

相關問題