gpt4 book ai didi

asp.net-mvc-4 - 在Web API中返回自定义错误对象

转载 作者:行者123 更新时间:2023-12-03 08:55:22 24 4
gpt4 key购买 nike

我有一个正在使用MVC 4 Web API框架的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));

编辑
看起来像我需要的自定义 HttpError。这似乎可以解决问题,现在可以从我的业务层进行扩展...
var error = new HttpError("invalid stuff") {{"status", -1}, {"substatus", 3}};
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, error));

最佳答案

这些答案比他们需要的复杂得多。

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Filters.Add(new HandleApiExceptionAttribute());
// ...
}
}

public class HandleApiExceptionAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
var request = context.ActionContext.Request;

var response = new
{
//Properties go here...
};

context.Response = request.CreateResponse(HttpStatusCode.BadRequest, response);
}
}

这就是您所需要的。单元测试也很好,也很容易:
[Test]
public async void OnException_ShouldBuildProperErrorResponse()
{
var expected = new
{
//Properties go here...
};

//Setup
var target = new HandleApiExceptionAttribute()

var contextMock = BuildContextMock();

//Act
target.OnException(contextMock);

dynamic actual = await contextMock.Response.Content.ReadAsAsync<ExpandoObject>();

Assert.AreEqual(expected.Aproperty, actual.Aproperty);
}

private HttpActionExecutedContext BuildContextMock()
{
var requestMock = new HttpRequestMessage();
requestMock.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());

return new HttpActionExecutedContext()
{
ActionContext = new HttpActionContext
{
ControllerContext = new HttpControllerContext
{
Request = requestMock
}

},
Exception = new Exception()
};
}

关于asp.net-mvc-4 - 在Web API中返回自定义错误对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16243021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com