MVC控制器返回了一个错误请求?

80

我想知道是否可以从MVC控制器返回带有内容的错误请求?我能够做到的唯一方法是 throw HttpException ,但是在这里我无法设置任何内容。我也尝试过另一种方式,但不知道为什么总是返回OK。这可行吗?

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

        return response;    
    }
}

2
尝试返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest, "Bad Request")。 - greenhoorn
7个回答

132
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "naughty");

12
仅作为一个侧注,对于最近访问此处的人:这个构造函数签名似乎在最新的Asp.Net MVC 6中不可用...至少对于Asp.Net Core 1 RC1。 - superjos
我遇到了一个问题,即返回BadRequest时出现错误。解决方法是从ControllerBase类继承API类。 - hozefam

30

将Http状态码设置为“错误请求(bad request)”,并使用Content方法将您的内容与响应一起发送。

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

1
这个(设置Response.StatusCode)对我有用。正如@superjos在上面提到的,那个构造函数似乎不再存在了。 - Jedidja

17

1
这是最好的答案。我无法从MVC控制器异常中发送任何内容,但这使其成为可能。 - Alexander

9
当然可以。
看看我的操作。
// 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();

希望这可以帮到你


4
您可以将错误消息传递给第二个参数,方法如下:
return new HttpResponseMessage(HttpStatusCode.BadRequest, "Your message here");

4
由于某种奇怪的原因,执行上述操作返回200状态码。我尝试过使用rest客户端(Postman)和AngularJS的http依赖进行尝试。 - Dr Schizo

1

针对 .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);
        }

1

TrySkipIisCustomErrors 标志可用于关闭 IIS 自定义错误处理。

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

5
尽管这段代码可能解决了问题,但包括一些解释真的有助于提高您的帖子质量。请记住,您是为将来的读者回答问题,这些人可能不了解您的代码建议的原因。另外,请尽量不要在代码中加入过多的说明注释,这会降低代码和解释的可读性! - Filnor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接