C# AspNetCore 3.1路由模糊匹配异常

C# AspNetCore 3.1路由模糊匹配异常,c#,asp.net-core,.net-core,asp.net-mvc-routing,C#,Asp.net Core,.net Core,Asp.net Mvc Routing,我正在尝试将我的webapp从.net core 2.1迁移到3.1,在此过程中,我将路由更改为app.UseRouting()和app.UseEndpoints(默认端点)方法,并删除了app.UseMvc(),如文档中所述 面对这个问题,发表这篇文章 详细信息 我在代码中有下面提到的3个控制器,它们使用属性进行了正确的版本控制 V2控制器示例 [Microsoft.AspNetCore.Mvc.ApiVersion("2.0")] [Route(&qu

我正在尝试将我的webapp从.net core 2.1迁移到3.1,在此过程中,我将路由更改为app.UseRouting()和app.UseEndpoints(默认端点)方法,并删除了app.UseMvc(),如文档中所述

面对这个问题,发表这篇文章

详细信息

我在代码中有下面提到的3个控制器,它们使用属性进行了正确的版本控制

V2控制器示例


    [Microsoft.AspNetCore.Mvc.ApiVersion("2.0")]
    [Route("v{version:apiVersion}")]

控制器具有类似的操作方法,当我尝试执行任何操作时(例如:http://localhost:xxxx/v1/GetData). 我得到以下例外

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException:'请求匹配多个终结点。匹配项:


    Stateless1.Controllers.V3.SAPClientV3Controller.GetSap (SampleWebApp)
    Stateless1.Controllers.V2.SAPClientV2Controller.GetSap (SampleWebApp)
    Stateless1.Controllers.V1.SAPClientController.GetSap 

PS:我已经通过在两个控制器的其余部分中删除此操作方法进行了测试,并且调用通过了另一个控制器,而不考虑系统中的v1、v2或v3http://localhost:xxxx/v1/GetData 网址

支持多api版本控制的代码也出现在启动中


    services.AddApiVersioning((o) =>
    {
        o.ReportApiVersions = true;
        o.DefaultApiVersion = new AspNetCore.Mvc.ApiVersion(1, 0);
        o.AssumeDefaultVersionWhenUnspecified = true;
    });


我也有同样的问题,我在微软的github上找到了这张票

我们需要指定[ApiController]参数,以便API版本控制生效。当我从DotnetCore2.0迁移到3.1时,这种情况才开始出现

为了清楚起见,以下是有效的方法:

     [ApiController]
        [ApiVersion("1.0")]
        [Route("api/v{version:apiVersion}/[controller]")]
        public class MyController : Controller
        {
            [MapToApiVersion("1.0")]
            public async Task<IActionResult> MethodA([FromBody] int? id)
            {
              return Ok();
            }
        }
        }



[ApiController]
        [ApiVersion("2.0")]
        [Route("api/v{version:apiVersion}/[controller]")]
        public class MyControllerV2 : Controller
        {
            [MapToApiVersion("2.0")]
            public async Task<IActionResult> MethodAV2([FromBody] int? id)
            {
              return Ok();
            }
        }
        }
[ApiController]
[ApiVersion(“1.0”)]
[路由(“api/v{version:apiVersion}/[控制器]”)
公共类MyController:Controller
{
[地图版本(“1.0”)]
公共异步任务方法A([FromBody]int?id)
{
返回Ok();
}
}
}
[ApiController]
[ApiVersion(“2.0”)]
[路由(“api/v{version:apiVersion}/[控制器]”)
公共类MyControllerV2:控制器
{
[地图版本(“2.0”)]
公共异步任务方法v2([FromBody]int?id)
{
返回Ok();
}
}
}

为了示例,我给出了V2的名称,但我认为最好的版本管理方法是将其与诸如V2.Home.MyController之类的名称空间一起使用

您使用的是什么版本的
Microsoft.AspNetCore.Mvc.Versioning
?在.NET标准项目中使用Microsoft.AspNetCore.Mvc.Versioning 2.3.0版本,该项目将在我的.NET Core 3.1应用程序中进一步使用。