C# AspNetCore 3.1路由模糊匹配异常
我正在尝试将我的webapp从.net core 2.1迁移到3.1,在此过程中,我将路由更改为app.UseRouting()和app.UseEndpoints(默认端点)方法,并删除了app.UseMvc(),如文档中所述 面对这个问题,发表这篇文章 详细信息 我在代码中有下面提到的3个控制器,它们使用属性进行了正确的版本控制 V2控制器示例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
[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应用程序中进一步使用。