MVC Controller возвращает неверный запрос?

Мне было интересно, можно ли было вернуть неверный запрос с контентом из контроллера MVC? Единственный способ сделать это - throw HttpException Однако здесь я не могу установить содержание. Пробовал этот подход, но по какой-то странной причине я всегда получаю ОК обратно. Можно ли сделать это?

public class SomeController : Controller
{
    [HttpPost]
    public async Task<HttpResponseMessage> Foo()
    {
        var response = new HttpResponseMessage(HttpStatusCode.BadRequest);
        response.Content = new StringContent("Naughty");

        return response;    
    }
}

7 ответов

Решение
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "naughty");

Установите код статуса Http на неверный запрос и используйте Content способ отправить ваш контент вместе с ответом.

public class SomeController : Controller
{
    [HttpPost]
    public async Task<ActionResult> Foo()
    {
        Response.StatusCode = 400;
        return Content("Naughty");
    }
}

В дополнение к ответу @Ekk не забудьте проверить это:

Неправильный запрос ASP.NET+Azure 400 не возвращает данные JSON

Добавьте следующую запись в ваш файл "web.config".

 <system.webServer>
    <httpErrors existingResponse="PassThrough"/>
 </system.webServer>

...

Конечно вы можете.

Посмотрите на мои действия

// GET: Student/Details/5
public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Student student = db.Students.Find(id);
    if (student == null)
    {
        return HttpNotFound();
    }
    return View(student);
}

Я думаю, что это лучшая практика

  1. возвращать HttpStatusCodeResult(HttpStatusCode.BadRequest); если пользователь не указал обязательное значение

  2. возвращать HttpNotFound(); если пользователь предоставил требуемое значение, но не скрыл

надеюсь, это поможет вам

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

return new HttpResponseMessage(HttpStatusCode.BadRequest, "Your message here");

Флаг TrySkipIisCustomErrors можно использовать для отключения настраиваемой обработки ошибок IIS.

[HttpGet]
public void Foo()
{
  HttpContext.Response.TrySkipIisCustomErrors = true;
  HttpContext.Response.StatusCode = 400;
  HttpContext.Response.Write("Naughty");
}

Ответ для .Net Core: ВозвратIActionResultкак описано здесь . Например:

              public IActionResult Get(int id = 0)
        {
            try
            {
                var obj = _myRepo.Get(id);                
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }

            return Ok(obj);
        }
Другие вопросы по тегам