在MVC中有效地处理未知的控制器动作

时间:2016-06-10 12:40:18

标签: c# asp.net-mvc task-parallel-library

我的网站面临着对不同操作名称的特定MVC控制器的不需要的机器人调用。它会导致非同一性行为的巨大例外。我们的测井系统几乎充斥着错误。

我们决定采用以下方法作为解决方法。

  1. 有效处理不存在操作的请求,因此不会抛出异常
  2. 限制机器人呼叫
  3. 我们编写了以下代码来实现这一目标。任何人都可以查看方法。

    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状态之前实现异步延迟。

1 个答案:

答案 0 :(得分:0)

使用Task.Result会导致锁定。将方法更改为......

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