我有一个.NET 6 ASP.net Core
web应用程序,我想在其中配置具有特定路径前缀的所有调用,以映射到特定控制器。
我想要的是所有形式为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()
方法中指定的路径。