【发布时间】:2020-05-20 18:35:07
【问题描述】:
在 3.0 之前,我可以通过访问 HttpContext 的 HttpRequest 属性然后更改 Path 的值来更改请求的路径(无需任何形式的浏览器重定向)。
例如,为了向需要更改密码的用户显示一个页面(与用户打算访问的页面无关),我扩展了 HttpContext
public static void ChangeDefaultPassword(this HttpContext context)
=> context.Request.Path = "/Account/ChangePassword";
这段代码将用户带到AccountController中的操作方法ChangePassword没有执行用户打算访问的操作方法。
然后进入dotnet core 3.1。
在 3.1 中,扩展方法改变了路径。但是,它从不执行 action 方法。它忽略更新的路径。
我知道这是由于路由的变化。现在可以使用扩展方法HttpContext.GetEndpoint() 访问端点。还有一个扩展方法HttpContext.SetEndpoint,这似乎是设置新端点的正确方法。但是,没有关于如何做到这一点的示例。
问题
如何在不执行原路径的情况下更改请求路径?
我的尝试
- 我尝试更改路径。 dotnet core 3.1 中的路由似乎忽略了 HttpRequest 路径值的值。
- 我尝试使用
context.Response.Redirect("/Account/ChangePassword");进行重定向。这可行,但它首先执行了用户请求的原始操作方法。这种行为违背了目的。 - 我尝试使用扩展方法
HttpContext.SetEndpoint,但没有可用的示例。
【问题讨论】:
-
您是否在自定义中间件中修改 URL?如果是,该中间件在管道中的哪个位置运行?
-
我认为任何 URL 的更改都应该通过 rewrite 中间件,docs.microsoft.com/en-us/aspnet/core/fundamentals/…
-
@KirkLarkin 我没有在中间件中这样做。我有一个扩展CookieAuthenticationEvents 的类。我在验证委托人时这样做。
-
@LexLi 这不适用
-
“不适用”在哪方面?
标签: .net-core url-routing asp.net-core-3.1 .net-core-3.1