ASP.NET MVC5 - 将查询字符串追加到所有 URL
本文关键字:追加 URL 字符串 查询 NET MVC5 ASP | 更新日期: 2023-09-27 17:56:52
我的团队正在为非常低端的"功能"手机构建一个简单的MVC网站。我们遇到的一个问题是某些手机会主动缓存HTML,因此用户实际看到的并不是我们想要的。一个极端的例子是,用户注册并得到一个"感谢页面"。然后,同一设备上的另一个用户尝试注册。手机只是提供缓存的页面,而不创建新帐户。
过去,我通过向我不想缓存的内容添加"缓存破坏"查询字符串来处理这个问题,例如所有页面都将以格式提供
http://domain.com/controller/route?cb=somerandomstringofnumbers
在这种情况下,我们需要对网站中的所有 URL 执行此操作 - 这包括由控制器操作自动生成的 URL,例如 RedirectToAction
或 Redirect
以及 Razor Url.Action
、Html.BeginForm
、Html.ActionLink
等。
现在显然我可以装饰 Razor HTML 帮助程序(或扩展它们)并将参数添加到控制器操作中,但在我看来,因为这些内置方法生成的实际 URL 是从传入的控制器/操作参数自动生成的,应该有一种方法可以劫持该过程。
不幸的是,MS类受到保护 - 我主要在System.Web.Routing.Routes中查找。
我尝试了一些我在网上找到的东西,但它们不是MVC5(可以追溯到2008年),而且框架似乎已经发生了重大变化。
例如,从http://forums.asp.net/t/1216840.aspx?Append+value+to+all+urls+built+by+RouteCollection+GetUrl
public class SessionAppendingRouteHandler : IRouteHandler
{
public IHttpHandler GetHandler(RequestContext context)
{
SessionAppendingHttpHandler handler = new SessionAppendingHttpHandler();
handler.RequestContext = context;
return handler;
}
}
public class SessionAppendingHttpHandler : MvcHandler
{
public override ProcessRequest(RequestContext context)
{
//append your sid here
}
}
// and in the route setup
RouteTable.Routes.Add( new Route
{
Url = "/[controller].mvc/[action]/",
Defaults = new { action = "index" },
RouteHandler = typeof(SessionAppendingRouteHandler)
});
由于框架变化太大,我无法开始工作,但它看起来非常接近我想要实现的目标。
我觉得我在正确的区域,但我撞到了一堵砖墙。
有什么建议吗?
这很老了,但让我根据我解决类似问题的方式来回答:
不要将其作为查询字符串,而是将cb
作为路由值,就像action
和controller
是路由值一样。您可以通过注册路由来执行此操作;例如:
routes.MapRoute(
name: "CB",
url: "{cb}/{controller}/{action}/{id}",
defaults: new { cb = "3600", area = "", id = UrlParameter.Optional }
);
如果 cb
的值不是常量,则可以找到一个方便的点来设置每个用户会话的cb
。一个好地方将是成功登录后。有了这个,您现在只需要为RedirectToAction
和ActionLink
提供两种自定义方法。您的实现将简单地打包一个RouteValueDictionary
,然后使用适当的重载将其传递给 MVC 自己的实现。