gpt4 book ai didi

c# - 来自 ASP.Net Web API 2 的统一、一致的错误响应

转载 作者:可可西里 更新时间:2023-11-01 07:46:55 26 4
gpt4 key购买 nike

我正在开发一个 Web API 2 应用程序,我目前正在尝试以统一的方式格式化错误响应(这样消费者也将知道他们可以检查哪些数据对象/结构以获取有关错误的更多信息) .这是我到目前为止所得到的:

{   
"Errors":
[
{
"ErrorType":5003,
"Message":"Error summary here",
"DeveloperAction":"Some more detail for API consumers (in some cases)",
"HelpUrl":"link to the docs etc."
}
]
}

这适用于应用程序本身抛出的异常(即内部 Controller )。但是,如果用户请求错误的 URI(并获得 404)或使用错误的动词(并获得 405)等,Web Api 2 会吐出默认错误消息,例如

{
Message: "No HTTP resource was found that matches the request URI 'http://localhost/abc'."
}

有没有办法捕获这些类型的错误(404、405 等)并将它们格式化为上面第一个示例中的错误响应?

到目前为止我已经尝试过:

  • 自定义 ExceptionAttribute 继承 ExceptionFilterAttribute
  • 自定义 ControllerActionInvoker 继承 ApiControllerActionInvoker
  • IExceptionHandler(来自 Web API 2.1 的新全局错误处理功能)

但是,这些方法都无法捕获这些类型的错误(404、405 等)。关于如何/如果可以实现这一点有什么想法吗?

...或者,我这样做的方式有误吗?我是否应该只针对应用程序/用户级错误以我的特定样式格式化错误响应,并依赖于 404 之类的默认错误响应?

最佳答案

您可以覆盖 DelegatingHandler 抽象类并拦截对客户端的响应。这将使您能够返回您想要的东西。

这里有一些关于它的信息。 http://msdn.microsoft.com/en-us/library/system.net.http.delegatinghandler(v=vs.118).aspx

这是 Web Api 管道的海报,其中显示了可以覆盖的内容。 http://www.asp.net/posters/web-api/asp.net-web-api-poster.pdf

像这样创建一个 Handler 类来覆盖响应

public class MessageHandler1 : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
Debug.WriteLine("Process request");
// Call the inner handler.
var response = base.SendAsync(request, cancellationToken);

Debug.WriteLine("Process response");
if (response.Result.StatusCode == HttpStatusCode.NotFound)
{
//Create new HttpResponseMessage message
}
;
return response;
}
}

在您的 WebApiConfig.cs 类中添加处理程序。

config.MessageHandlers.Add(new MessageHandler1());

更新正如 Kiran 在评论中提到的,您可以使用 OwinMiddleware 拦截返回客户端的响应。这适用于在任何主机上运行的 MVC 和 Web Api。

下面是一个示例,说明如何获取响应并在响应发送到客户端时对其进行更改。

public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use(typeof(MyMiddleware));
}
}

public class MyMiddleware : OwinMiddleware
{
public MyMiddleware(OwinMiddleware next) : base(next) { }

public override async Task Invoke(IOwinContext context)
{
await Next.Invoke(context);
if(context.Response.StatusCode== 404)
{
context.Response.StatusCode = 403;
context.Response.ReasonPhrase = "Blah";
}
}
}

关于c# - 来自 ASP.Net Web API 2 的统一、一致的错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24207583/

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