c# - 如何禁用 Api 版本控制的默认错误响应

标签 c# asp.net-core versioning .net-6.0

大家晚上好。尝试为我的项目实现 Api 版本控制。面临接收请求的默认错误模板响应的问题。 查看代码1

{
    "error": {
        "code": "UnsupportedApiVersion",
        "message": "The HTTP resource that matches the request URI 'https://localhost:5003/v2.3' does not support the API version '2.3'.",
        "innerError": null
    }
}

但我有自己的错误响应模板想要接收。

{
"traceId": "0HMF1NONVN8SF:00000002",
    "errors": [
        {
            "message": "",
            "source": ""
        }
    ]
}

据我了解,我可以实现自己的 ErrorResponseProvider,但我可以避免这样做吗?

如何禁用 ApiVersionOptions 的 ErrorResponse? 我的api版本配置:

 services
   .AddApiVersioning(opt =>
                {
                    opt.ApiVersionReader = new UrlSegmentApiVersionReader();
                    opt.UseApiBehavior = false;
                    opt.DefaultApiVersion = ApiVersion.Default;
                    opt.AssumeDefaultVersionWhenUnspecified = true;
                })
                .AddVersionedApiExplorer(opt =>
                {
                    opt.GroupNameFormat = "'v'VV";
                    opt.SubstituteApiVersionInUrl = true;
                });

版本:

.NET 6

ASP.NET Core 6

Microsoft.AspNetCore.Mvc.版本控制 5

最佳答案

实际上我没有找到禁用它的方法。但是,我找到了适合我的情况的解决方案。首先,我为 ErrorResponses 实现了 CustomErrorResponseProvider。

 public class CustomErrorResponseProvider : DefaultErrorResponseProvider
    {
        public override IActionResult CreateResponse(ErrorResponseContext context)
        {
            switch (context.ErrorCode)
            {
                case "UnsupportedApiVersion":
                    throw new UnsupportedApiVersionException("Url", context.Message);
            }

            return base.CreateResponse(context);
        }
    }

然后开始抛出必要的异常。仅此而已!

由于我的中间件看起来像 this(下面的图片),我的 ErrorHandlingMiddleware 没有捕获异常,因为它是由默认 api 版本控制错误处理程序生成的。 enter image description here

关于c# - 如何禁用 Api 版本控制的默认错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70884017/

相关文章:

c# - 如何将asp-append-version ="true"实现到background-image属性?

nuget - 可以使用 NuGet 获取以前的版本吗?

c# - 如何以编程方式选择数据绑定(bind) ListBox 控件中的项目

c# - 使用 Moq 设置和验证表达式

asp.net-mvc - ASP.NET Core TestServer 导致 Razor View 出现 HTTP 500

vue.js - Vue-CLI 版本号 - 它是否存在以及如何在 Vue 应用程序本身中使用它?

cmake - 2.8.12 之前的 target_include_directories?

c# - 将匿名类型转换为接口(interface)?

c# - System.IO.FileInfo 不区分大小写的搜索

c# - "Processing of the LINQ expression ' GroupByShaperExpression“升级到 ef 核心后出错。5