Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC5-将查询字符串附加到所有URL_C#_Asp.net Mvc - Fatal编程技术网

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

C# ASP.NET MVC5-将查询字符串附加到所有URL,c#,asp.net-mvc,C#,Asp.net Mvc,我的团队正在为非常低端的“功能”手机构建一个简单的MVC站点。我们面临的一个问题是,某些手机主动缓存HTML,因此用户实际看到的并不是我们想要的。一个极端的例子是,用户注册后会得到一个“感谢页面”。然后,同一设备上的另一个用户尝试注册。手机只需为缓存页面提供服务,而无需创建新帐户 在过去,我通过在我不希望缓存的内容中添加一个“cache buster”查询字符串来处理这个问题,例如所有页面都将以这种格式提供 http://domain.com/controller/route?cb=somera

我的团队正在为非常低端的“功能”手机构建一个简单的MVC站点。我们面临的一个问题是,某些手机主动缓存HTML,因此用户实际看到的并不是我们想要的。一个极端的例子是,用户注册后会得到一个“感谢页面”。然后,同一设备上的另一个用户尝试注册。手机只需为缓存页面提供服务,而无需创建新帐户

在过去,我通过在我不希望缓存的内容中添加一个“cache buster”查询字符串来处理这个问题,例如所有页面都将以这种格式提供

http://domain.com/controller/route?cb=somerandomstringofnumbers

在这种情况下,我们需要对站点中的所有Url执行此操作-这包括由控制器操作自动生成的Url,例如
redirectoaction
Redirect
,以及Razor
Url.Action
Html.BeginForm
Html.ActionLink

现在很明显,我可以修饰Razor HTML帮助程序(或扩展它们)并将参数添加到控制器操作,但在我看来,因为这些内置方法生成的实际URL是从传入的控制器/操作参数自动生成的,所以应该有一种方法劫持该过程

不幸的是,MS类受到保护-我主要查看System.Web.Routing.Routes

我尝试了一些我在网上发现的东西,但它们不是MVC5(可以追溯到2008年),而且框架似乎已经发生了重大变化

例如,从

这是我无法工作的框架已经改变了太多,但它看起来非常接近我想要实现的

我觉得我在正确的领域,但我撞到了砖墙


有什么建议吗

这已经很老了,但让我根据我如何解决类似问题来回答:

与其将其作为查询字符串,不如将
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自己的实现。

这是非常古老的,但让我根据我如何解决类似问题来回答:

与其将其作为查询字符串,不如将
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自己的实现。

您确定需要这样一个迂回的解决方案吗?您在使用哪些特定设备/浏览器时遇到问题?您是否尝试过确保所有的非幂等运算都是通过POST完成的,并设置了缓存控制:no Cache?这里没有人有时间进行所有这些操作,请直接到point@IainGalloway-诺基亚5330,自带本机浏览器。已设置缓存控制。我们在应该使用POST的地方使用POST。这很奇怪。。因此,我正在考虑采取绝望的措施。到目前为止,只在该设备上有报告,但我们的目标是大量低端设备,因此报告将不断出现。@Manish-如果您不想阅读详细信息,您真的不需要帮助。这里没有人强迫你全部阅读。仅供参考,如果你阅读了你发布链接的整个页面,你会发现最初提出的解决方案没有达到他或你想要的效果。他最终提出的解决方案是添加许多覆盖,您表示希望避免这些覆盖。您确定需要这样一个迂回的解决方案吗?您在使用哪些特定设备/浏览器时遇到问题?您是否尝试过确保所有的非幂等运算都是通过POST完成的,并设置了缓存控制:no Cache?这里没有人有时间进行所有这些操作,请直接到point@IainGalloway-诺基亚5330,自带本机浏览器。已设置缓存控制。我们在应该使用POST的地方使用POST。这很奇怪。。因此,我正在考虑采取绝望的措施。到目前为止,只在该设备上有报告,但我们的目标是大量低端设备,因此报告将不断出现。@Manish-如果您不想阅读详细信息,您真的不需要帮助。这里没有人强迫你全部阅读。仅供参考,如果你阅读了你发布链接的整个页面,你会发现最初提出的解决方案没有达到他或你想要的效果。他最终提出的解决方案是添加许多覆盖,您表示希望避免这些覆盖。您确定需要这样一个迂回的解决方案吗?您在使用哪些特定设备/浏览器时遇到问题?您是否尝试过确保所有的非幂等运算都是通过POST完成的,并设置了缓存控制:no Cache?这里没有人有时间进行所有这些操作,请直接到point@IainGalloway-诺基亚5330,自带本机浏览器。已设置缓存控制。我们在应该使用POST的地方使用POST。这很奇怪。。因此,我正在考虑采取绝望的措施。到目前为止,只在该设备上有报告,但我们的目标是大量低端设备,因此报告将不断出现。@Manish-如果您不想阅读详细信息,您真的不需要帮助。这里没有人强迫你读