将 Location URI 指向另一个控制器

Set Location URI point to another controller

我有一个带有动作的控制器,我想将 LocationUri 设置为指向另一个控制器。例如,我有:

[Route("auth")]
[ApiController]
public class AuthorisationController
{
        [Route("{id}")]
        public IActionResult Put([FromRoute]string id, [FromBody]FooBar request)
        {
            return new CreatedResult("locationUri", SanitiseResponse(request));
        }
}

我希望 LocationUri 指向这个控制器

[Route("transaction")]
[ApiController]
public class TransactionController
{
    [Route("{id}")]
    public IActionResult Get([FromRoute] string id)
    {
        return new OkResult();
    }
}

知道我该怎么做吗?我正在使用 _httpContextAccessor 自己构建它,但想知道是否有更好的方法?

这是派生自 ControllerBase 的地方,因为它提供了一个帮助成员来简化您要实现的目标

[Route("auth")]
[ApiController]
public class AuthorisationController : ControllerBase {
    [Route("{id}")]
    public IActionResult Put([FromRoute]string id, [FromBody]FooBar request) {
        return CreatedAtAction("Get", "Transaction", { id = ??? }, SanitiseResponse(request));
    }
}

引用ControllerBase.CreatedAtAction Method

您仍然可以使用 CreatedAtActionResult

自己完成
[Route("auth")]
[ApiController]
public class AuthorisationController {
    [Route("{id}")]
    public IActionResult Put([FromRoute]string id, [FromBody]FooBar request) {
        return new CreatedAtActionResult("Get", "Transaction", { id = ??? }, SanitiseResponse(request));
    }
}

这基本上就是辅助方法包装的内容。

请注意示例中的 ???,您将在其中指定 id routeValue,在本例中,它是生成的 URI[=18= 的一部分]

为避免对操作和控制器进行硬编码,您可以执行以下操作,但我发现它相当冗长。

//...

string actionName = nameof(TransactionController.Get);
string controllerName = nameof(TransactionController).TrimEnd("Controller");

return CreatedAtAction(actionName, controllerName, { id = ??? }, SanitiseResponse(request));

//...

如果重构控制器名称或操作名称,这将允许 IDE 自动进行更改或显示语法错误,提醒您更改。