ASP WebMethod返回JSON数据时,应返回状态码404。

4
我尝试返回状态码404和JSON响应,代码如下:
[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static dynamic Save(int Id)
{
    HttpContext.Current.Response.StatusCode = (int)HttpStatusCode.NotFound;
    return new 
    {
        message = $"Couldn't find object with Id: {id}"
    };
}

但我一直得到HTML错误页面的404错误,而不是JSON响应。 我尝试了各种操作 Response ,例如Flush、Clear、Write、SuppressContent和CompleteRequest(不按顺序),但每当我返回404时,它仍然会选择HTML错误页面。
有没有想法如何返回状态码而不是200 OK(因为它不好,它是错误)和JSON响应?
我知道我可以抛出异常,但我宁愿不这样做,因为它不能与 customErrors mode =“On”一起使用。
这是一个旧的ASP.Net网站项目,似乎大多数ASP MVC的解决方案都无法使用。

如果出现错误,为什么不使用InternalServerException?如果是无效参数,比如{id},为什么不使用BadRequest?当使用System.Web.Http.ApiController时,特别容易实现,只需要:返回InternalServerError(Exception)或返回BadRequest(string)。 - Arno
刚测试完其他东西:如果你想要返回一个HttpResponseMessage,可以使用以下代码:return Request.CreateResponse(HttpStatusCode.NotFound, "我的信息"); - Arno
@Drag0nvil 如果参数是int类型,那么它就不是无效的参数,对吧?我的理解是,如果我无法使用提供的ID在数据库中找到对象,那么这就是一个“未找到对象”的错误。而且,很遗憾,return InternalServerError(Exception) 在这个版本的ASP WebSites中不起作用。返回内部服务器错误的HTTP状态代码将产生与404相同的效果,即会给我返回一个HTML页面。返回“错误请求”的状态代码只会返回一个文本响应“错误请求”,没有其他内容,所以这也不起作用。 - Joakim Johansson
请查看我的第二篇帖子,当我在我的 REST 服务器上使用它并使用 Postman 进行测试时,它将在正文中显示:“我的信息”。如果没有显示,则很抱歉,您的版本/配置与我使用的不同。 - Arno
@OleksandrTyshchenko 写入 Output 或 OutputStream 似乎也不会删除任何 HTML 页面的写入。因此,除非有一些方法可以抑制 HTML 页面的写入(我认为 SuppressContent 可以做到,但它没有),否则它将无法工作 :( - Joakim Johansson
显示剩余4条评论
1个回答

6
通常当你得到HTML错误页面时,这意味着IIS接管了未找到错误的处理。
您可以通过告诉响应跳过IIS自定义错误来通常绕过/禁用此错误。
[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static dynamic Save(int id) {
    //...

    //if we get this far return not found.
    return NotFound($"Couldn't find object with Id: {id}");
}

private static object NotFound(string message) {
    var statusCode = (int)System.Net.HttpStatusCode.NotFound;
    var response = HttpContext.Current.Response;
    response.StatusCode = statusCode;
    response.TrySkipIisCustomErrors = true; //<--
    return new {
        message = message
    };
}

1
你真是个救星,Nkosi,它完美地运行了!跳过这些 WebMethods 的自定义错误并不是问题,因为我不认为将 HTML 错误作为 AJAX 请求的响应有任何意义。 - Joakim Johansson

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