C# CreateDataAction不考虑.Net Core 3.0中控制器中设置的路由模板
我正在构建一个restful api,当适当的端点被命中时,它将返回创建的C# CreateDataAction不考虑.Net Core 3.0中控制器中设置的路由模板,c#,asp.net,.net,asp.net-core,.net-core,C#,Asp.net,.net,Asp.net Core,.net Core,我正在构建一个restful api,当适当的端点被命中时,它将返回创建的201。为了做到这一点,我尝试使用createDataAction和CreatedAtRoute方法,但它们都不遵守在控制器顶部(或操作顶部)定义的路由,而是使用startup.cs中存在的默认路由。如果我在控制器顶部命名路由,并使用CreatedAtRoute,它将部分尊重路由,但它将id字段作为查询字符串参数传递,而不是将其作为路由的一部分使用(如操作指定的) [ApiVersion(“1.0”)] [路由(“api/
201
。为了做到这一点,我尝试使用createDataAction
和CreatedAtRoute
方法,但它们都不遵守在控制器顶部(或操作顶部)定义的路由,而是使用startup.cs
中存在的默认
路由。如果我在控制器顶部命名路由,并使用CreatedAtRoute
,它将部分尊重路由,但它将id
字段作为查询字符串参数传递,而不是将其作为路由的一部分使用(如操作指定的)
[ApiVersion(“1.0”)]
[路由(“api/v{version:apiVersion}/[controller]”,Name=“Organizations”)]
公共类组织控制器:BaseController
{
[HttpGet(“{id}”,Name=“GetOrganization”)]
公共异步任务组织(字符串id)
{
var命令=新的GetOrganizationQuery(id);
返回Ok(等待Mediator.Send(命令));
}
[HttpPost]
[产品响应类型(StatusCodes.Status201Created)]
公共异步任务CreateOrganization(CreateOrganizationCommand)
{
var organization=wait Mediator.Send(命令);
返回CreateDataAction(“GetOrganization”、“Organizations”,
新的{id=organization.id},组织);
}
}
如果我使用:
返回CreateDataAction(“GetOrganization”,“Organizations”,新的{id=organization.id},organization);
//或
返回CreateDataAction(“GetOrganization”,新的{id=organization.id},organization);
位置标题为位置:https://localhost:5001/Organizations/GetOrganization/08d76ebb-95a9-ec4c-7bea-dbb5ff20cf06
如果我使用:
返回CreatedAtRoute(“GetOrganization”,新的{id=organization.id},organization);
我收到一个错误,没有与提供的值匹配的路由。
如果我使用:
返回CreatedAtRoute(“组织”,新的{id=organization.id},组织);
我非常接近,但ID作为查询字符串添加,如下所示:location:https://localhost:5001/api/v1/Organizations?id=08d76ebc-4b79-d9bf-32e9-3cf4202ebce7
如果我试图使ID成为控制器上的可选参数,它会附加到控制器内的所有操作,这也是不可行的解决方案
将位置设置为正确路线的正确方法是什么?因此,错误的根源实际上是路线中存在的
ApiVersion
。即使将应用程序设置为在未指定时将AssumeDefaultVersion设置为true,该值似乎不会影响内部路由。为了让应用程序选择正确的路由,我必须在createDataAction
方法中指定api版本,如下所示:
[ApiVersion(“1.0”)]
[路由(“api/v{version:apiVersion}/[控制器]”)
公共类组织控制器:BaseController
{
[HttpGet(“{id}”)]
公共异步任务组织(字符串id)
{
var命令=新的GetOrganizationQuery(id);
返回Ok(等待Mediator.Send(命令));
}
[HttpPost]
[产品响应类型(StatusCodes.Status201Created)]
公共异步任务CreateOrganization(CreateOrganizationCommand命令,ApiVersion版本)
{
var organization=wait Mediator.Send(命令);
返回CreateDataAction(nameof(GetOrganization),
新的{id=organization.id,version=version.ToString()},
组织);
}
}
你可以看到更多