使用CreatedAtRoute/Action路由匹配失败:租户-公司父子资源创建问题
问题描述
我已经搜索过类似问题但未找到匹配结果,目前正在尝试创建隶属于Tenant(父资源)的Company(子资源),并在响应中返回该资源的URI。
相关代码配置
API控制器路由配置
[ApiController] [Route("api/tenants/{tenantId}/companies")] public class CompanyController : ControllerBase
GetCompanyById方法配置
[HttpGet("{companyId:guid}")] [ActionName(nameof(GetCompany))] public async Task<IActionResult> GetCompany(Guid tenantId, Guid companyId) { var result = await _sender.Send(new GetCompanyQuery(tenantId, companyId)); return Ok(result); }
创建Company的方法
[HttpPost] public async Task<IActionResult> CreateCompany(Guid tenantId, CreateCompanyRequest request) { var company = new CreateCompanyCommand( request.Name, request.NavraeName, request.NavraeStoreNo, request.AddressStreet, request.AddressUnit, request.AddressCity, request.AddressState, request.AddressZip, request.Phone, request.Email, tenantId); var result = await _sender.Send(company); if (result.IsFailure) return BadRequest(result.Error); return CreatedAtRoute( routeName: nameof(GetCompany), routeValues: new {tenantId, companyId = result.Value}, value: result); }
我尝试使用CreatedAtAction时也出现错误,错误截图如下:
解决方案
问题核心是路由名称匹配错误:CreatedAtRoute依赖的是路由的名称标识,而非Action的名称。你之前用ActionName仅修改了Action的调用名称,但未给目标Get路由设置对应的命名标识。
步骤1:给Get路由添加名称属性
修改GetCompany方法的HttpGet属性,通过Name参数指定路由名称,同时可以移除多余的ActionName属性(因为Action本身名称就是GetCompany):
[HttpGet("{companyId:guid}", Name = nameof(GetCompany))] public async Task<IActionResult> GetCompany(Guid tenantId, Guid companyId) { var result = await _sender.Send(new GetCompanyQuery(tenantId, companyId)); return Ok(result); }
步骤2:验证CreatedAtRoute调用
现在你的CreatedAtRoute调用已经正确传递了tenantId和companyId两个路由参数,修改后会自动匹配到目标路由,返回正确的资源URI。
若使用CreatedAtAction的正确写法
如果想改用CreatedAtAction,同一控制器下直接指定Action名称和路由参数即可:
return CreatedAtAction(nameof(GetCompany), new { tenantId, companyId = result.Value }, result);
内容的提问来源于stack exchange,提问作者Kent Hub
相关产品推荐
相关产品推荐

