обычно, когда я смотрю на приложение MVC ASP.NET, Таблица маршрутизации настроена при запуске и не затронута с тех пор.
У меня есть несколько вопросов на этом, но они тесно связаны друг с другом:
Фон: Прокомментируйте, что Спаммеры обычно захватывают URL регистрации с веб-сайта и затем не потрудились проходить веб-сайт больше, чтобы сделать их автоматизированный спам. Если бы я регулярно изменяю свой URL сообщения некоторым случайный, спаммеры должны были бы вернуться к сайту и найти, что корректный URL сообщения попытался послать спам. Если бы тот URL постоянно изменяется, я думал бы, что это могло сделать работу спаммеров более утомительной, который должен обычно означать, что они разочаровываются в затронутом URL.
Я бы подумал о реализации своего собственного 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);
}
}
Я не знаю это лучшее решение, но на данный момент мне приходит в голову именно оно.