我可以在 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 服务
asmx web 服务 - jQuery ajax post json (500 错误) - CORS (Access-Control-Allow-Origin 设置为 *)
jQuery Ajax 到 asp.net asmx web 服务抛出请求格式无效:application/json