Web api dotnet core 中的 Api 版本控制错误的自定义错误响应

Posted

技术标签:

【中文标题】Web api dotnet core 中的 Api 版本控制错误的自定义错误响应【英文标题】:Customized error responses for ApiVersioning errors in webapi dotnet core 【发布时间】:2018-08-13 22:26:55 【问题描述】:

我正在为 Webapi 服务中的所有错误创建一个包库。该库将用于为 BadRequest、BadArgument、ApiVersionsing 等相关错误提供自定义响应。我需要帮助自定义与 ApiVersion 相关的错误 - ApiVersionUnspecified、UnsupportedApiVersion、InvalidApiVersion、AmbiguousApiVersion。我已经按照这篇文章为我的项目添加了 api-versioning - https://www.hanselman.com/blog/ASPNETCoreRESTfulWebAPIVersioningMadeEasy.aspx

我已经检查了上述包的 github wiki,发现“根据所需的行为,您可以扩展 DefaultErrorResponseProvider 或者您可以从 stratch 实现自己的 IErrorResponseProvider。

要连接备用错误响应行为,请将默认提供程序替换为您自己的:"

options => options.ErrorResponses = new MyErrorResponseProvider();

但是;我不太明白如何在 MyErrorResponseProvider 类中自定义默认错误响应。有人可以为我提供任何示例,以便我可以开始使用吗?

提前致谢!

【问题讨论】:

【参考方案1】:

找到了上面的实现方式——

class MyErrorResponseProvider : DefaultErrorResponseProvider

// note: in Web API the response type is HttpResponseMessage
public override IActionResult CreateResponse( ErrorResponseContext context )

       switch ( context.ErrorCode )
       
           case "UnsupportedApiVersion":
               context = new ErrorResponseContext(
                   context.Request,
                   context.StatusCode,
                   context.ErrorCode,
                   "My custom error message.",
                   context.MessageDetail );
               break;
       

       return base.CreateResponse( context );


感谢github问题@-https://github.com/Microsoft/aspnet-api-versioning/issues/233

【讨论】:

还应该提到的是,这只是自定义了默认错误响应负载的信息。如果要更改所有内容,则需要返回 IActionResult 的任何实现。这可以包括您自己的自定义错误响应负载。【参考方案2】:

答案仅自定义 ASP.NET API 版本控制返回的错误消息。

要自定义整个响应,您可以通过返回 ObjectResult 来实现它。

Startup.cs

// Add API Versioning to the service container to your project
        services.AddApiVersioning(config =>
        
            // Advertise the API versions supported for the particular endpoint
            config.ReportApiVersions = true;
            config.ErrorResponses = new ApiVersioningErrorResponseProvider();//Send standard error response when API version error.
        );

ApiVersioningErrorResponseProvider.cs

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Versioning;

public class ApiVersioningErrorResponseProvider : DefaultErrorResponseProvider

    public override IActionResult CreateResponse(ErrorResponseContext context)
    
       //You can initialize your own class here. Below is just a sample.
        var errorResponse = new
        
            ResponseCode = 101,
            ResponseMessages = "Something went wrong while selecting the api version",
            HelpLink = "https://github.com/microsoft/aspnet-api-versioning/wiki/Error-Response-Provider"
        ;
        var response = new ObjectResult(errorResponse);
        response.StatusCode = (int)HttpStatusCode.BadRequest;

        return response;
    

产生以下输出:


"ResponseCode": 101,
"ResponseMessages": "Something went wrong while selecting the api version",
"HelpLink": "https://github.com/microsoft/aspnet-api-versioning/wiki/Error-Response-Provider"

【讨论】:

以上是关于Web api dotnet core 中的 Api 版本控制错误的自定义错误响应的主要内容,如果未能解决你的问题,请参考以下文章

dotnet core webapi json-api 兼容查询字符串路由

如何在 dotnet core web api 中设置起始页?

dotnet core docker web api没有连接

如何在 dotnet core Web Api 中返回自定义错误消息

无法在asp dotnet core web api中创建HttpGet和HttpDelete。

使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)