2016-06-10 85 views
0

我的站點正面臨着不需要的機器人對具有不同操作名稱的特定MVC控制器的調用。它導致了非常規行爲的巨大異常。我們的記錄系統幾乎充滿了錯誤。在MVC中有效地處理未知的控制器操作

我們已決定採取以下方法作爲解決方法。

  1. 有效地處理請求非存在動作,因此不會引發異常
  2. 節流下來的機器人呼叫

我們已經寫了下面的代碼來實現這一目標。任何人都可以查看該方法。

protected override void HandleUnknownAction(string actionName) 
{ 
    if (this.ActionInvoker.InvokeAction(this.ControllerContext, 
     "ReturnErrorForUnknownAction")) return; 
} 

public ActionResult ReturnErrorForUnknownAction() 
{ 
    return Task.Delay(2000).ContinueWith(t => 
    { 
     return new HttpStatusCodeResult(System.Net.HttpStatusCode.NotFound); 
    }).Result; 
} 

上面的代碼工作正常,但不知道是否「ReturnErrorForUnknownAction」是一個阻塞調用。根據我的知識Task.Result阻止當前線程。

我的初衷是在發送404狀態之前實現異步延遲。

回答

0

使用Task.Result會導致鎖定。改變的方法來類似...

public async Task<ActionResult> ReturnErrorForUnknownAction() 
{ 
    return await Task.Delay(2000).ContinueWith(t => 
    { 
     return new HttpStatusCodeResult(System.Net.HttpStatusCode.NotFound); 
    }); 
} 
+0

我嘗試了上述代碼,但它會引發錯誤 「**額外的資料:異步操作方法‘ReturnErrorForUnknownAction’返回一個任務,這是不能被同步執行**」 Error this form method ** this.ActionInvoker.InvokeAction ** – user897062

0

從下面代碼,HandleUnKnownAction方法趕上輸入請求,並重定向特定視圖,如果它存在於該應用程序。如果它無法在我們的解決方案中找到視圖,那麼它將由catch塊處理。

public class HandleUnknownActionController : Controller 
    { 
    // GET: HandleUnknownAction 
    public ActionResult Index() 
    { 
    return View(); 
    } 
    protected override void HandleUnknownAction(string actionName) 
    { 
    try 
    { 
    this.View(actionName).ExecuteResult(this.ControllerContext); 
    } 
    catch(Exception ex){// here we can catch the view not found error} 
    } 
    } 

http://dotnet-helpers.com/mvc/use-views-without-action-using-mvchandleunknownaction-mvc/

相關問題