Как заставить MVC отклонять запросы с глаголами, отличными от указанных в ограничении? - PullRequest
1 голос
/ 03 октября 2011

В моем приложении MVC я хочу, чтобы поведение, как было ранее указано в <httpHandlers> в web.config, а именно, что если я регистрирую такой обработчик, как это:

<system.webServer>
    <handlers>
        <add name="processData" verb="POST" path="processData" type="RightType, RightAssembly"/>
    </handlers>
</system.webServer>

, тогда все запросы к /processDataглаголы, отличные от «POST», приводят к HTTP 404.

Я пытался зарегистрировать маршрут следующим образом:

routes.MapRoute(
    @"ProcessData", @"processData",
    new { controller = @"Api", action = @"ProcessData" },
    new { httpMethod = new HttpMethodConstraint( "POST" ) } );

и теперь, когда в запросе есть глагол, отличный от POST, маршрут нене совпадает, разрешение маршрута падает и переходит на страницу по умолчанию.

Как заставить MVC выдавать сообщение об ошибке HTTP (код 404 или что-то в этом роде), если путь совпадает, но глагол не совпадает?

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Вы можете просто зарегистрировать другой маршрут с нежелательными глаголами и привести к действию NotFound.

0 голосов
/ 03 октября 2011

Маршрутизация работает по следующим маршрутам в указанном порядке, пока не найдет тот, который соответствует. Добавив ограничение, вы заставите этот маршрут провалиться, и он пойдет вниз по списку, чтобы найти следующий соответствующий маршрут (по умолчанию).

Чтобы получить желаемое поведение, вам нужно, чтобы ваш маршрут перехватил запрос, а затем обработал ошибку.

Уберите ограничение с маршрута и на вашем контроллере сделайте следующее:

[HttpPost]
public ActionResult processData(myModel myPostedModel)
{
    DoStuff();
    Return View();
}

public ActionResult processData()
{
    throw new HttpException(404);
}

Я предполагаю, что вы делаете привязку модели к вашему методу действия здесь, потому что вам нужны отличающиеся сигнатуры метода. Если нет, то вам нужно снять атрибут HttpPost и проверить там метод запроса.

...