(通过System.InvalidOperationException: No route matches the supplied values
方法发布新项目时,以下控制器将引发CreatedAtRoute
异常:
namespace MyApp.Controllers
{
[ApiController]
[Route("api/offices/{officeId}/[controller]")]
public class ResourcesController : ControllerBase
{
/* ... */
[HttpGet]
public async Task<IActionResult> GetAsync(Guid officeId) =>
this.Ok(await this.client.GetResourcesAsync(officeId));
[HttpGet("{id}", Name = "GetResourceById")]
public async Task<IActionResult> GetAsync(Guid officeId, string id)
{
var resource = await this.client.GetResourceAsync(officeId, id);
return resource == null ? (IActionResult) this.NotFound() : this.Ok(resource);
}
[HttpPost]
public async Task<IActionResult> PostAsync(Guid officeId, Resource resource)
{
try
{
var result = await this.client.CreateResourceAsync(officeId, resource);
return this.CreatedAtRoute("GetResourceById", new {officeId, id = resource.Id}, result);
}
catch (Exception e)
{
this.logger.LogError(e, "Error while creating a resource");
return this.StatusCode((int)HttpStatusCode.InternalServerError);
}
}
}
}
这是错误还是使用控制器级别指定的路由值的另一种方法?
在 asp.net核心3(预览版8)上进行了测试。
答案 0 :(得分:0)
资源的Id值为null
,因此传递给该方法的匿名对象缺少 id 值,该值在路由模板和路由上不是可选的找不到。
使用result.Id
解决了此问题,因为客户端正在分配ID(由后面的MongoDb实例生成)。
答案 1 :(得分:-1)
我认为这是因为您提供的参数。
在这一行中,您为根提供了2个匿名对象参数,但是您的根包含并要求1个参数。
return this.CreatedAtRoute("GetResourceById", new {officeId, id = resource.Id}, result);
编辑
我认为{id}参数与您的根参数有冲突。
[Route("api/offices/{officeId}/[controller]")]
[HttpGet("{id}", Name = "GetResourceById")]
public async Task<IActionResult> GetAsync(Guid officeId, string id)
{
var resource = await this.client.GetResourceAsync(officeId, id);
return resource == null ? (IActionResult) this.NotFound() : this.Ok(resource);
}