Динамическое изменение маршрутов ASP.NET MVC - PullRequest
11 голосов
/ 29 марта 2010

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 29 марта 2010

Я хотел бы реализовать свой собственный 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); 
    } 
} 

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

3 голосов
/ 07 августа 2014

Учитывая реальную проблему, обычным подходом является включение динамически создаваемого номера транзакции. Он должен храниться в скрытом поле формы, а также в словаре сеансов на стороне сервера и быть действительным только для одного запроса.

Я думаю, что сегодня многие фреймворки предоставляют такой механизм безопасности; тогда как этот тип атаки известен как Cross-Site-Request-Forgery (csrf).

...