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,例如 RedirectToActionRedirect 以及 Razor Url.ActionHtml.BeginFormHtml.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)
});

由于框架变化太大,我无法开始工作,但它看起来非常接近我想要实现的目标。

我觉得我在正确的区域,但我撞到了一堵砖墙。

有什么建议吗?

ASP.NET MVC5 - 将查询字符串追加到所有 URL

这很老了,但让我根据我解决类似问题的方式来回答:

不要将其作为查询字符串,而是将cb作为路由值,就像actioncontroller是路由值一样。您可以通过注册路由来执行此操作;例如:

 routes.MapRoute(
     name: "CB",
     url: "{cb}/{controller}/{action}/{id}",
     defaults: new { cb = "3600", area = "", id = UrlParameter.Optional }
 );

如果 cb 的值不是常量,则可以找到一个方便的点来设置每个用户会话的cb。一个好地方将是成功登录后。有了这个,您现在只需要为RedirectToActionActionLink提供两种自定义方法。您的实现将简单地打包一个RouteValueDictionary,然后使用适当的重载将其传递给 MVC 自己的实现。