2014-11-05 4 views
0

Я пытаюсь стандартизировать модель расширения для нашей команды разработчиков REST API. Нам необходимо обеспечить стандартную реализацию маршрутов, позволяя также настраивать реализации маршрутов, которые также заменяют значение по умолчанию.Как переопределить веб-маршрут api?

В качестве простого примера, если у нас есть GET маршрут api/users так:

public class DefaultUsersController : ApiController 
{ 
    [HttpGet] 
    [Route("api/users", Order = 0)] 
    public IEnumerable<string> DefaultGetUsers() 
    { 
     return new List<string> 
     { 
      "DefaultUser1", 
      "DefaultUser2" 
     }; 
    } 
} 

Мы ожидаем, что работы по умолчанию, как это:

enter image description here

Теперь разработчик хочет изменить поведение этого маршрута, он должен иметь возможность просто определить тот же маршрут с , чтобы какой-то механизм предполагал, что их реализация должна быть использована, а не по умолчанию , Мое первоначальное мышление состояло в том, чтобы использовать Order property on the Route attribute, поскольку именно так оно и есть, как способ обеспечить приоритет (в порядке возрастания), когда обнаружен двусмысленный маршрут. Однако это не работает таким образом, рассмотреть эту пользовательскую реализацию, что мы хотим переопределить по умолчанию api/users маршрут по:

public class CustomUsersController : ApiController 
{ 
    [HttpGet] 
    [Route("api/users", Order = -1)] 
    public IEnumerable<string> CustomGetUsers() 
    { 
     return new List<string> 
     { 
      "CustomUser1", 
      "CustomUser2" 
     }; 
    } 
} 

Обратите внимание на свойство заказа устанавливается в -1, чтобы придать ему более низкое значение приоритета, чем по умолчанию, который установлен на 0. Я бы подумал, что это будет использоваться DefaultHttpControllerSelector, но это не так. Из DefaultHttpControllerSelector:

enter image description here

И мы в конечном итоге с этим исключением возвращается в ответ:

enter image description here

Можно ли Microsoft просто пропустил логики/требование использовать Order как Маршрутный рассогласование, и это ошибка? Или есть еще один простой способ переопределить маршрут, надеюсь, с атрибутом?

ответ

0

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

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

Что я буду делать, это, вероятно, переключение URL. Тем более, что этот вопрос является временным в моем случае. Однако мне было бы интересно, есть ли у кого-то лучший вариант.

Смежные вопросы