动态更改 ASP.NET MVC 路由

13

通常情况下,当我查看 ASP.Net MVC 应用程序时,路由表会在启动时进行配置,并且在此之后不再更改。

我有几个相关的问题:

  • 是否可以在运行时更改路由表?
  • 我应该如何避免线程问题?
  • 也许有更好的方法来提供动态 URL 吗?我知道 ID 等可以出现在 URL 中,但不知道它如何适用于我想实现的内容。
  • 如何避免默认控制器/操作路由定义后,特定组合(例如“评论”控制器上的“发布”操作)不适用于默认路由?

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


你是怎么解决这个问题的?能和我分享一下吗? - Learning-Overthinker-Confused
2个回答

12

我考虑实现自己的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); 
    } }`

我的操作调用程序,其中应编写处理操作的自定义逻辑或不处理操作的逻辑:

    class MyActionInvoker : ControllerActionInvoker 
{ 
    protected override ActionResult InvokeActionMethod(MethodInfo methodInfo, IDictionary<string, object> 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); 
    } 
} 

我不知道它是否是最好的解决方案,但目前它是我想到的一个。


谢谢,我也会看看的。 - flq

4
考虑到实际问题背景,通常的方法是添加一个动态创建的事务号。它应该被存储在一个隐藏的表单字段和服务器端会话字典中,并且仅对一个请求有效。
我认为今天很多框架都提供了这样的安全机制;而这种攻击类型被称为跨站点请求伪造(csrf)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接