2017-02-10 12 views
3

У меня есть две следующие настройки маршрутов, и они работают нормально при отправке действительного запроса.Разрешить идентификатор строки с помощью MVC-маршрута ASP.NET

config.Routes.MapHttpRoute("DefaultApiWithId", "{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" }); 
config.Routes.MapHttpRoute("DefaultApiWithAction", "{controller}/{action}"); 

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

public HttpResponseMessage Get(string id) 
{ 
    //output the id again 
} 

Если я называю localhost:80/users/123, я получаю ответ обратно, что является действительным, и он будет выводить 123. Когда я пытаюсь использовать недопустимый ID, например, тот, который содержит буквы с ошибкой со следующей ошибкой.

{ «Сообщение»: «Ни один HTTP ресурс не был найден соответствующий запрос URI „http://localhost:80/users/d1g“.», «MessageDetail»: "Никаких действий не было найдено на контроллере„Пользователи“, совпадающим с именем" d1g '. "}

Я вижу, что происходит не так. Этот запрос должен соответствовать первому маршруту, но вместо этого он соответствует второму маршруту. У меня есть 2 метода под названием Get. Один принимает ID, а другой не требует ID. Тот, который не требует ID, возвращает список всех записей. У меня были большие проблемы с этим, и маршрут выше - то, как я решил проблему.

+0

Он не должен соответствовать первому маршруту. Этот маршрут имеет ограничение, которое допускает только числа 'new {id = @" \ d + "}' для параметра id. И это так, что он не столкнется с отображением второго маршрута – Nkosi

+0

Я думаю, что для вашего первого GET вы указали маску здесь: 'new {id = @" \ d + "}', попробуйте удалить его. Но также я думаю, что у вас должен быть только один метод с простым решением: если «ID» передан, верните Object, иначе верните список. Но я бы пошел другим путем. –

+0

Если я удалю ограничение, я получаю сообщение об ошибке «Было найдено несколько действий, соответствующих запросу: \ r \ nSystem.Net.Http.HttpResponseMessage Get()". Это имеет смысл, поскольку у меня есть 2 метода получения. Тот, который принимает идентификатор и другой, который не принимает ничего, чтобы вернуть список записей –

ответ

2

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

config.Routes.MapHttpRoute(
    "DefaultApiWithAction", 
    "{controller}/{action}/{id}" 
    new { id = RouteParameter.Optional } 
); 

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "{controller}/{id}", 
    new { action = "Get", id = RouteParameter.Optional } 
); 
+0

Это решает проблему, но в свою очередь создает ту же проблему, что и раньше. Было найдено несколько действий, которые соответствуют запросу: \ r \ nSystem.Net.Http.HttpResponseMessage Get() для типа. Я хочу, чтобы один контроллер работал следующим образом:/controller/= call get(),/controller/id = call get (string id) –

+0

Bingo, это делает работу. Не знаю почему, но я думал, что жесткое кодирование действия, которое нужно получить, вызовет проблемы, но это, похоже, отлично сработало –