动态更改ASP.NET MVC路由

通常,当我查看ASP.Net MVC应用程序时,Route表会在启动时配置,并且不会在以后触及。

我有几个问题,但它们彼此密切相关:

  • 是否可以在运行时更改路由表?
  • 我应该/应该如何避免线程问题?
  • 是否有更好的方法来提供动态URL? 我知道ID等可以出现在URL中,但无法看到它如何适用于我想要实现的目标。
  • 即使我定义了默认控制器/操作路由,我怎么能避免这种情况,默认路由不适用于特定组合,例如“注释”控制器上的“发布”操作无法通过默认路由获得?

背景:评论垃圾邮件发送者通常会从网站上获取发布url,然后再也无需通过网站来进行自动垃圾邮件发送。 如果我经常将我的postURL修改为一些随机的URL,垃圾邮件发送者必须返回该站点并找到正确的postURL以尝试发送垃圾邮件。 如果该URL不断变化,我认为这可能会使垃圾邮件发送者的工作更加乏味,这通常意味着他们放弃了受影响的URL。

考虑到实际问题背景,通常的方法是包括动态创建的交易号。 它应存储在隐藏的表单字段以及服务器端会话字典中,并且仅对一个请求有效。

我想今天很多框架都提供了这样一种安全机制; 而这种攻击类型称为跨站点请求伪造(csrf)。

我会考虑实现自己的IRouteHandler,并在我的自定义ControllerActionInvoker中添加一些自定义逻辑。 怎么样? 路由表不会动态更改,但您可以在自定义ControllerActionInvoker中检查路径路径中的随机参数,并调用或不调用相应的操作。

我的路线:

routes.Add ( new Route ( "blog/comment/{*data}", new RouteValueDictionary(new {controller = "blog", action = "comment", data = ""}), new MyRouteHandler() ) ); 

我的路线处理程序:

  class MyRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new MyHttpHandler(requestContext); } }` 

我的经纪人:

 class MyHttpHandler : MvcHandler { public MyHttpHandler(RequestContext requestContext) : base(requestContext) { } protected override void ProcessRequest(HttpContextBase httpContext) { IController controller = new BlogController(); (controller as Controller).ActionInvoker = new MyActionInvoker(); controller.Execute(RequestContext); } }` 

和我的行动ivoker,其中应该编写或不处理动作的自定义逻辑:

  class MyActionInvoker : ControllerActionInvoker { protected override ActionResult InvokeActionMethod(MethodInfo methodInfo, IDictionary parameters) { var data = ControllerContext.RouteData.GetRequiredString("data"); // put my custom logic to check whetever I'll handle the action or not. The data could be a parameter in the database for that purpose. return base.InvokeActionMethod(methodInfo, parameters); } } 

我不知道它是最好的解决方案,但现在它是我想到的那个。