我有一个Web API,我正在使用MVC 4 Web API框架 . 如果有异常,我现在正在抛出一个新的HttpResponseException . 即:
if (!Int32.TryParse(id, out userId))
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid id"));
这会将一个对象返回给客户端,这只是 {"message":"Invalid id"}
我希望通过返回更详细的对象来进一步控制对异常的响应 . 就像是
{
"status":-1,
"substatus":3,
"message":"Could not find user"
}
我该怎么做呢?是序列化我的错误对象并在响应消息中设置它的最佳方法吗?
我已经调查了 ModelStateDictionary
并且已经提出了"hack"的这一点,但它仍然不是一个干净的输出:
var msd = new ModelStateDictionary();
msd.AddModelError("status", "-1");
msd.AddModelError("substatus", "3");
msd.AddModelError("message", "invalid stuff");
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, msd));
edit
看起来像一个自定义 HttpError
是我需要的 . 这似乎可以解决问题,现在可以从我的业务层扩展它...
var error = new HttpError("invalid stuff") {{"status", -1}, {"substatus", 3}};
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, error));
3 回答
这些答案比他们需要的更复杂 .
这就是你所需要的 . 单元测试也很好很容易:
我认为这样可以解决问题:
为业务层创建自定义异常类:
创建一个静态方法以从
MyException
的实例生成HttpError
. 我在这里使用反射,所以我可以添加属性MyException
并且总是让它们返回w / o更新Create
:我目前有一个常规异常处理程序的自定义属性 . 所有类型为
MyException
的异常都将在此处理:当我在这个计划中找到漏洞时,我会更多地玩这个并更新 .
看看下面的文章 . 它将帮助您控制Web api异常和错误消息:Web Api, HttpError, and the Behavior of Exceptions