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" }
);
}
但是,它不起作用。具体来说:
- 如果我调用
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()
方法中指定的方法。
我有一个 .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" }
);
}
但是,它不起作用。具体来说:
- 如果我调用
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()
方法中指定的方法。