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



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

我想要的是所有形式为http://myhost/ipc/some_action的调用调用控制器LocalIpcController的动作some_action。以下是我如何在Startup类中设置路由:

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

然而,它不起作用。具体而言:

  • 如果我调用http://myhost/ipc/some_action,我会得到404错误
  • 如果我呼叫http://myhost/some_action,它工作正常

因此,路径中的/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()方法中指定的路径。