Запись ограничения «httpMethod» на маршруте должна иметь строковое значение

У меня есть проект веб-API asp.net, и в моем файле WebApiConfig у меня определен следующий маршрут:

config.Routes.MapHttpRoute(
    name: "Web API Get",
    routeTemplate: "api/{controller}",
    defaults: new { action = "Get" },
    constraints: new { httpMethod = new HttpMethodConstraint("GET") }
    );

В целях интеграционного тестирования я хочу сделать запрос к HttpSelfHostServer, чтобы убедиться, что мы получаем правильные данные обратно от вызова API. Я делаю HttpRequestMessage следующим образом:

var httpMethod = new HttpMethod("GET");
var request = new HttpRequestMessage(httpMethod, "http://localhost:XXXX/api/User/");
var results = _client.SendAsync(request).Result;

Я ожидаю, что это вызовет метод Get для UserController, а затем вернет результаты, определенные в этом методе. Однако вместо этого я получаю следующее исключение:

System.InvalidOperationException: запись ограничения «httpMethod» на маршруте с шаблоном маршрута «api/{controller}» должна иметь строковое значение или иметь тип, который реализует «IHttpRouteConstraint»

Этот же URL-адрес (http://localhost:XXXX/api/User/) работает без ошибок, когда я использую его в браузере, поэтому я почти уверен, что проблема должна заключаться в том, как я отправляю запрос на HttpSelfHostServer через HttpClient. Вместо этого я попытался использовать константу HttpMethod.Get, но это также вызвало ту же ошибку.

Кто-нибудь знает, как я могу решить эту проблему?


person scourge192    schedule 23.08.2013    source источник
comment
это может помочь вам emilsblog.lerch.org/2012/05/ параметр ограничения-для-маршрута.html   -  person Sunil Mishra    schedule 23.08.2013
comment
У меня нет доступа к объекту WebApi Url, чтобы использовать предлагаемое им решение. Я вижу, что направление маршрута, скорее всего, RouteDirection.UrlGeneration, а httpMethod не найден (отсюда и исключение). Как я могу получить httpMethod со строковым значением GET в свой запрос без использования метода Url.Action()?   -  person scourge192    schedule 23.08.2013
comment
Хорошо, я наткнулся на класс UrlHelper, который, похоже, делает то же самое, что и объект Url в контроллерах. Однако теперь я получаю новую ошибку, связанную с объектом конфигурации. Я обновлю свой вопрос в ближайшее время с более подробной информацией...   -  person scourge192    schedule 23.08.2013
comment
К сожалению, в тот момент объект конфигурации был нулевым. После исправления я вернулся к тому, с чего начал, с первым исключением.   -  person scourge192    schedule 23.08.2013


Ответы (1)


Убедитесь, что вы используете proper type для вашего ограничения:

constraints: new { httpMethod = new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get) }

Я предполагаю, что вы использовали System.Web.Routing.HttpMethodConstraint, который является совершенно другой класс, используемый для маршрутизации ASP.NET MVC и не имеющий ничего общего с маршрутизацией веб-API ASP.NET.

person Darin Dimitrov    schedule 23.08.2013
comment
Вау, да, это было. Спасибо, я уже некоторое время бьюсь головой об это. - person scourge192; 23.08.2013
comment
Да, Microsoft создала адский беспорядок, когда они обманули каждый отдельный класс для этого веб-API, который был доступен в MVC, но в разных сборках и пространствах имен. Это очень распространенная причина ошибок. - person Darin Dimitrov; 23.08.2013
comment
Отличный ответ, это было действительно хорошо замечено @DarinDimitrov, спасибо. - person nickspoon; 31.10.2014