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

Мне было интересно, можно ли вернуть неверный запрос с содержимым из контроллера 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;    
    }
}

person Dr Schizo    schedule 08.07.2015    source источник
comment
Попробуйте вернуть новый HttpStatusCodeResult (HttpStatusCode.BadRequest, Bad Request);   -  person greenhoorn    schedule 08.07.2015


Ответы (6)


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

public class SomeController : Controller
{
    [HttpPost]
    public async Task<ActionResult> Foo()
    {
        Response.StatusCode = 400;
        return Content("Naughty");
    }
}
person ShankarSangoli    schedule 30.09.2015
comment
Это (настройка Response.StatusCode) сработало для меня. Как упоминалось выше @superjos, этого конструктора, похоже, больше нет. - person Jedidja; 01.06.2018

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

ASP.NET+Azure 400 Bad Request не не возвращать данные JSON

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

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

...

person Masood Khaari    schedule 30.12.2015
comment
Это лучший ответ. Я не мог ничего отправить из исключения контроллера mvc, но это позволило. - person Alexander; 18.06.2020

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

Взгляните на мою акцию

// 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(); в случае, если пользователь предоставил требуемое значение, но не завуалировал

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

person Basheer AL-MOMANI    schedule 22.08.2016

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

return new HttpResponseMessage(HttpStatusCode.BadRequest, "Your message here");
person Ekk    schedule 08.07.2015
comment
Выполнение вышеуказанного возвращает мне 200 по какой-то странной причине. Я пробовал это, используя как клиент для отдыха, то есть почтальона, так и через http-зависимость angularjs. - person Dr Schizo; 08.07.2015

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

[HttpGet]
public void Foo()
{
  HttpContext.Response.TrySkipIisCustomErrors = true;
  HttpContext.Response.StatusCode = 400;
  HttpContext.Response.Write("Naughty");
}
person Евгений Широков    schedule 14.05.2020
comment
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. Также старайтесь не перегружать свой код пояснительными комментариями, это снижает читабельность как кода, так и пояснений! - person Filnor; 14.05.2020

person    schedule
comment
просто примечание для людей, которые приходят сюда в эти дни: эта подпись конструктора, похоже, недоступна в последней версии Asp.Net MVC 6... по крайней мере, для Asp.Net Core 1 RC1 - person superjos; 25.05.2016