2016-06-10 3 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 возвращает задачу, которая не может быть выполнена синхронно **» Ошибка приходит форма метод ** 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/

Смежные вопросы