我可以在 ASMX JSON 服务上设置 HTTP 响应代码并引发异常吗?

Posted

技术标签:

【中文标题】我可以在 ASMX JSON 服务上设置 HTTP 响应代码并引发异常吗?【英文标题】:Can I Set the HTTP Response Code & Throw an Exception on an ASMX JSON Service? 【发布时间】:2012-12-25 02:26:02 【问题描述】:

在响应 JSON 的 ASP.NET ASMX WebMethod 中,我可以同时抛出异常并设置 HTTP 响应代码吗?我想如果我抛出一个 HttpException,状态码会被适当地设置,但它不能让服务响应任何东西,除了 500 错误。

我尝试了以下方法:

[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void TestWebMethod() 
    throw new HttpException((int)HttpStatusCode.BadRequest, "Error Message");

还有:

[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void TestWebMethod() 
    try 
        throw new HttpException((int)HttpStatusCode.BadRequest, "Error Message");
    
    catch ( HttpException ex ) 
        Context.Response.StatusCode = ex.GetHttpCode();
        throw ex;
    

这两个都以 500 响应。

非常感谢。

【问题讨论】:

你有什么收获吗? 【参考方案1】:

将您的代码更改为:

[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void TestWebMethod() 
    try 
        throw new HttpException((int)HttpStatusCode.BadRequest, "Error Message");
    
    catch ( HttpException ex ) 
        Context.Response.StatusCode = ex.GetHttpCode();

        // See Markus comment
        // Context.Response.StatusDescription("Error Message");
        // Context.Response.StatusDescription(ex.Message); // exception message
        // Context.Response.StatusDescription(ex.ToString()); // full exception
    

基本上你不能,也就是说,当抛出异常时,结果总是相同的 500。

【讨论】:

这会导致相反的问题。异常永远不会出现在响应中。客户端有状态码但没有错误信息。 为什么不 Response.StatusDescription(ex.ToString()) 两者兼得?刚刚更新了我的答案。 StatusDescription 应该反映 StatusCode(200 的 OK,404 的 Not Found 等)。它不应该是自定义值。 @Markus,我同意,但对于真正的 500 或任何其他不那么常见的错误,自定义描述可能很有用。

以上是关于我可以在 ASMX JSON 服务上设置 HTTP 响应代码并引发异常吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 对象反序列化为 List<type> 不适用于 asmx 服务

如何从 2.0 asmx Web 服务返回 JSON

asmx web 服务 - jQuery ajax post json (500 错误) - CORS (Access-Control-Allow-Origin 设置为 *)

jQuery Ajax 到 asp.net asmx web 服务抛出请求格式无效:application/json

asmx Web 服务在 .net 4.0 中返回 xml 而不是 json

IIS7上ASMX Web服务的性能调整和优化