Ron*_*n C 9 asp.net-core-mvc asp.net-core asp.net-core-routing
如果我有一个控制器,其操作方法使用基于属性的路由并像这样声明它,那么一切都很好:
[HttpGet]
[Route("/dev/info/{*somevalue}")]
public IActionResult Get(string somevalue) {
return View();
}
Run Code Online (Sandbox Code Playgroud)
我可以路由到上述操作方法,例如通过指定以/dev/info/hello-world或结尾的 url/dev/info/new-world
然而,我的业务要求是有一个如下所示的网址:/dev/hello-world/info或/dev/new-world/info 并且有无数这样的网址,它们都需要路由到控制器上的相同操作方法。
我想在操作方法上设置基于属性的路由,如下所示:
[HttpGet]
[Route("/dev/{*somevalue}/info/")]
public IActionResult Get(string somevalue) {
return View();
}
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,网络项目运行后我就会收到以下错误:
处理请求时发生未处理的异常。RouteCreationException:属性路由信息发生以下错误:
对于操作:“App.SomeController.Get (1-wwwSomeProject)”错误:包罗万象的参数只能显示为路由模板的最后一段。参数名称:routeTemplate Microsoft.AspNetCore.Mvc.Internal.AttributeRoute.GetRouteInfos(IReadOnlyList actions)
必须有某种方法来解决此错误。知道办法吗?
中间件就是实现这一目标的方法。
如果您需要 api 响应,很容易实现内联。
if (app.Environment.IsDevelopment())
{
app.Use(async (context, next) =>
{
Console.WriteLine(context.Request.Path);
if (context.Request.Path.ToString().EndsWith("/info"))
{
// some logic
await context.Response.WriteAsync("Terminal Middleware.");
return;
}
await next(context);
});
}
Run Code Online (Sandbox Code Playgroud)
如果您需要调用控制器,您只需通过中间件编辑请求路径即可实现您的要求。
您可以在此处找到示例:https ://stackoverflow.com/a/50010787/3120219
| 归档时间: |
|
| 查看次数: |
1852 次 |
| 最近记录: |