Маршрутизация атрибутов в Web API с RoutePrefix - Странная ошибка

1
    [RoutePrefix("ServiceRequest")]
    public class ServiceRequestController : ApiController
    {
        [HttpPost]
        [Route("")]
        public IHttpActionResult Post([FromBody]ServiceRequest.Models.ServiceRequest serviceRequest)
        {
            return Ok();
        }
    }

Я использую пустой Route() для POST в WebAPI и WebAPI

' http://localhost.com:59985/ServiceRequest/

Это вызывает ошибку, указывающую HTTP Error 405.0 - Method Not Allowed и, скорее всего, приведенные причины были

  • В запросе, отправленном на веб-сервер, использовался HTTP-глагол, который не разрешен модулем, настроенным для обработки запроса

    (или)

    Запрос был отправлен на сервер, содержащий неверный HTTP-глагол

    (или)

    Запрос предназначен для статического содержимого и содержит HTTP-глагол, отличный от GET или HEAD

    (или)

    Запрос был отправлен в виртуальный каталог, используя HTTP-протокол POST, а документ по умолчанию - это статический файл, который не поддерживает HTTP-глаголы, отличные от GET или HEAD.

Однако, если вы используете Route ("Test"), метод just works fine как показано ниже:

[POST] на http://localhost.com:59985/ServiceRequest/Test - работает нормально. (Route is [Route("Test")])

[POST] на http://localhost.com:59985/ServiceRequest ------- не работает (Route is [Route("")]

Пуст Route не разрешен для POST? Какие-нибудь идеи, что здесь не так?

  • 0
    Для ответа 405, какие значения вы видите в заголовке «Разрешить»?
  • 0
    @KiranChalla: Пожалуйста, смотрите ответ ниже. Оказалось, что это проблема.
Теги:
asp.net-web-api
asp.net-web-api2
asp.net-web-api-routing

2 ответа

1
Лучший ответ

Оказывается, это проблема, потому что [RoutePrefix("ServiceRequest")] имеет то же имя, что и имя контроллера.

Когда я изменил [RoutePrefix()] все работало нормально, как и раньше.

  • 0
    Что вы изменили [RoutePrefix()] на? У него нет публичного пустого конструктора.
1

[RoutePrefix] добавляет префикс к вашим маршрутам. Итак, в вашем примере, если вы не укажете [RoutePrefix], то по соглашению ваш маршрут будет:

.../api/ServiceRequest

Добавляя [RoutePrefix] вы говорите, что маршруты в этом контроллере будут иметь префикс по указанному маршруту, то есть вы фактически меняете свой маршрут на:

.../api/ServiceRequest/ServiceRequest

Может ли это быть причиной вашей проблемы? Я не уверен, что у RoutePrefix с тем же именем, что и контроллер, была проблема, но я мог ошибаться - я все еще довольно новичок в этом.

  • 0
    Я думаю, не то же самое .. Когда вы используете attribute routing , вам не нужно использовать ../api/.. вообще. Он заменяет их и определяет новый маршрут внутри

Ещё вопросы

Сообщество Overcoder
Наверх
Меню