2

Я бы хотел, чтобы улавливался весь маршрут, соответствующий основному префиксу маршрута («api/myaccount/1»), если на других контроллерах больше нет определенных маршрутов (т. Е. api/myaccount/1/feature "), однако я получаю следующее исключение, когда я это делаю:asp.net webapi2 поймать весь маршрут

Было найдено несколько типов контроллеров, соответствующих URL. Это может произойти, если маршруты атрибутов на нескольких контроллерах соответствуют запрошенному адресу .

Как уже упоминалось здесь: Multiple controller types were found that match the URL. This can happen if attribute routes on multiple controllers match the requested URL кажется, что это невозможно.

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


FYI: У меня улов все работает нормально («апи/MyAccount/1/{* URI}») это просто быть в состоянии это проблема.

ответ

4

Оказывается, это довольно просто, мне просто нужно создать настраиваемый селектор контроллера и переопределить функцию GetControllerName. Это особенно переопределение требуется потому, что метод можно было бы ожидать, чтобы переопределить:

HttpControllerDescriptor SelectController(HttpRequestMessage request) 

не просто возвращает дескриптор (или нулевое значение, если он не может найти соответствия), как вы можете ожидать. Метод фактически обрабатывает запрос для вас и возвращает 404:/Тем не менее, как только вы знаете о том, что она тривиальна работать вокруг, и я был в состоянии получить поведение я хотел, используя код ниже:

using System.Web.Http; 
using System.Web.Http.Dispatcher; 

public class CustomControllerSelector : DefaultHttpControllerSelector 
{ 
    public override string GetControllerName(HttpRequestMessage request) 
    { 
     var name = base.GetControllerName(request); 
     if(string.IsNullOrEmpty(name)) 
     { 
      return "MyFeature"; //important not to include "Controller" suffix 
     } 
     return name; 
    } 
} 

И добавьте его в свою конфигурацию:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
      ... 

      config.Services.Replace(typeof(IHttpControllerSelector), 
       new CustomControllerSelector(config)); 
      ... 
    } 
} 
Смежные вопросы