ASP.NET核心路由映射:忽略前缀

ASP.NET Core route mapping: prefix is ignored

我有一个 .NET 6 ASP.net Core Web 应用程序,我想在其中配置所有具有特定路径前缀的调用以映射到特定控制器。

我想要的是所有形式为 http://myhost/ipc/some_action 的调用都调用控制器 LocalIpcController 的操作 some_action。这是我在 Startup class:

中设置路线的方式
//Configure routing
app.UseEndpoints(endpoints =>
{
    //Local IPC endpoint
    endpoints.MapControllerRoute(
        name: "Ipc",
        pattern: "ipc/{action}",
        defaults: new { controller = "LocalIpc" }
    );
}

但是,它不起作用。具体来说:

所以看起来路径中的 /ipc 前缀被完全忽略了。为什么会这样?

PS:我知道我也可以使用控制器上的 [Route] 属性来执行此操作,但我想知道为什么它无法通过 MapControllerRoute() 工作以及我的原因我做错了。

我测试了它,它对我有用。这是管道配置和测试控制器:

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

// Don't forget to use the UseRouting middleware.
app.UseRouting();

app.UseHttpsRedirection();

app.UseAuthorization();

app.UseEndpoints( endpoints => {
    //Local IPC endpoint
    endpoints.MapControllerRoute(
        name: "Ipc",
        pattern: "ipc/{action}",
        defaults: new { controller = "LocalIpc" }
    );
});

注意:不要忘记包含 app.UseRouting();

public class LocalIpcController : ControllerBase
{
    public LocalIpcController()
    {
    }

    [HttpGet]
    public IActionResult Get()
    {
        return Content("I'm here.");
    }
}

我还想补充一点,在我看来,从可读性的角度来看,在端点中间件选项中定义 URL 路由并不是最好的方法,我只会在某些边缘情况下使用它。在 Route 属性中指定它会更清楚(或者你甚至可以将它放入 HTTP 方法属性构造函数中,例如 [HttpGet("ipc/some_action")])。

事实证明,我没有正确理解路由属性在 ASP.net 中的工作原理。

在我的控制器中,操作方法是这样标记的:

[HttpGet("some_action")]
public IActionResult MyMethod()
{
}

我的印象是"some_action"会附加到配置阶段指示的路径,以获得"ipc/some_action",但显然不是这样,属性中指定的路由似乎覆盖了 MapControllerRoute() 方法中指定的方法。