Измените ASP.NET Маршруты MVC динамично

обычно, когда я смотрю на приложение MVC ASP.NET, Таблица маршрутизации настроена при запуске и не затронута с тех пор.

У меня есть несколько вопросов на этом, но они тесно связаны друг с другом:

  • Действительно ли возможно изменить таблицу маршрутизации во времени выполнения?
  • Как/должны, я стараюсь не распараллеливать проблемы?
  • Существует ли, возможно, лучший способ обеспечить динамический URL? Я знаю, что идентификаторы и т.д. могут появиться в URL, но не видеть, как это могло быть применимо в том, чего я хочу достигнуть.
  • Как я могу избежать, чтобы, даже при том, что у меня есть определенный маршрут контроллера/действия по умолчанию, что маршрут по умолчанию не работает на определенную комбинацию, например, действие "Сообщения" с контроллером "Комментариев" не было доступно через маршрут по умолчанию?

Фон: Прокомментируйте, что Спаммеры обычно захватывают URL регистрации с веб-сайта и затем не потрудились проходить веб-сайт больше, чтобы сделать их автоматизированный спам. Если бы я регулярно изменяю свой URL сообщения некоторым случайный, спаммеры должны были бы вернуться к сайту и найти, что корректный URL сообщения попытался послать спам. Если бы тот URL постоянно изменяется, я думал бы, что это могло сделать работу спаммеров более утомительной, который должен обычно означать, что они разочаровываются в затронутом URL.

11
задан John Saunders 7 August 2014 в 16:02
поделиться

1 ответ

Я бы подумал о реализации своего собственного IRouteHandler и поместил некоторую настраиваемую логику в мой настраиваемый ControllerActionInvoker. Как это будет работать? Таблица маршрутов не будет динамически изменяться, но вы можете проверить в своем настраиваемом ControllerActionInvoker случайный параметр в пути маршрута и вызвать или нет соответствующее действие.

Мой маршрут:

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

Мой обработчик маршрута I:

    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<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); 
    } 
} 

Я не знаю это лучшее решение, но на данный момент мне приходит в голову именно оно.

11
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: