Запустите HttpResponse вручную в ASP.Net Core Controller. - PullRequest
0 голосов
/ 22 мая 2019

Я хочу отправить HttpResponse, если проверка условия в вспомогательном методе завершается неудачно, поэтому код после проверки условия никогда не выполняется.

Мне известны такие удобные методы, как «return Unauthorized ()», которыеможет вызываться в контроллере, но не может использоваться в вспомогательном методе.Я знаю, что вспомогательный метод мог бы возвращать логическое значение, которое проверяется в предложении if, однако предпочтительным является однострочный "AssertCondition ()".Возможно ли это?

    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        AssertCondition();
        //do other things
        return Ok();
    }

    private void AssertCondition()
    {
        //check some condition 
        if (true == false)
        {
            //condition failed I want to send a http response here
        }
    }

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Хотя вы можете подключиться к контексту запроса в своем вспомогательном методе, так как он выглядит так, как будто он находится в том же классе контроллера, что и ваше действие, это не будет наилучшей практикой. Что, если вы хотите повторно использовать ваш вспомогательный метод в других контроллерах или в другом месте?

Лучший способ выполнить то, что вы описываете, - использовать Фильтр действий .

1007 * Е.Г. *

public class MyCustomActionFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext context)
  {
    // Check some condition 
    if (true == false)
    {
      // Return a bad request response without executing the action method
      context.Result = new BadRequestResult();
    }
  }
}

Тогда вы можете применить это к вашему методу действия следующим образом:

[MyCustomActionFilter]
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
  //do other things
  return Ok();
}
0 голосов
/ 22 мая 2019

Нет, это невозможно при использовании стандартного ASP.NET Core. Думайте о своем контроллере как о любом другом классе. У него есть методы, которые возвращают результаты. Не было бы смысла делать это:

public class DoesSomething
{
    public string GetString(string input)
    {
        HelperMethod();
        return "whatever";
    }

    private void HelperMethod()
    {
       // Somehow cause the calling method, GetString,
       // to return something, circumventing the normal
       // control flow.
    }
}

По сути, именно так мы и поступили бы, если бы вернули ActionResult прямо из вспомогательного метода. Это было бы похоже на закрытый метод, который выбирает возвращать результат от имени метода, который его вызвал. Поскольку контроллер такой же, как и любой другой класс, мы не можем этого сделать.

Единственный обходной путь - выбросить исключение из вашего вспомогательного метода. Однако это не рекомендуется, потому что это означает использование исключения для потока управления. Если мы хотим вернуть определенный код состояния, для этого есть методы типа StatusCode(int).


Причина, по которой я добавляю квалификатор «использование стандартного ASP.NET Core», заключается в том, что в других версиях вы могли просто выбросить HttpResponseException из другого метода, и даже в рамках ASP.NET Core люди создавали пользовательские исключения и промежуточное ПО для достижения аналогичный результат. Это было удалено из ASP.NET Core, поскольку сводится к использованию исключений для потока управления. См. Ответ на этот вопрос вместе со ссылкой на другое обсуждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...