6

Я пытаюсь добавить документацию API в свою бэкэнд-систему. По умолчанию ApiExplorer и страница справки работали отлично, пока я не представил версии своим контроллерам Api.Пользовательский ApiExplorer с ApiControllers на основе пространства имен

Для того, чтобы добавить версии, которую я создал подпапки в папке Controllers:

  • v1
  • v2
  • v3

и имеют версии API контроллеров на основе там. Для того, чтобы мой Апи обнаруживаемым я переписать DefaultHttpControllerSelector принять во внимание пространств имен, предоставленных любым клиентом и сопоставить их с правильными контроллерами:

Это нарушили мой дефолт ApiExplorer и следующее свойство возвращает ZERO описания api

Configuration.Services.GetApiExplorer().ApiDescriptions 

Как я могу настроить существующий ApiExplorer и помочь ему найти контроллеров Api и не переписывать всю реализацию ApiExplorer. Мне действительно нужно просто показать, где найти моих контроллеров Api.

Просьба сообщить.

+1

Я пытаюсь сделать то же самое ... Любой шанс, который вы выяснили, как это реализовать? – Saaman

+0

Я ответил на ваш вопрос ниже –

+0

Спасибо большое! Я попробую это решение. – Saaman

ответ

6

Оказалось, что не имеет ничего общего с ApiExplorer. Вместо этого вы должны изменить свой контроллер на основе пространства имен:

NamespaceHttpControllerSelector : DefaultHttpControllerSelector 
{ 
//... 
    public override IDictionary<string, HttpControllerDescriptor> GetControllerMapping() 
    { 
     var mapping = base.GetControllerMapping(); 
     mapping["User"] = new HttpControllerDescriptor 
     { 
      Configuration = _httpConfig, 
      ControllerName = "User", 
      ControllerType = typeof(UserController) 
     }; 
     //... 
     return mapping; 
    } 
    //... } 

То есть. После этого по умолчанию ApiExplorer найдет вас контроллерами и выберет все действия.

1

Я сталкивался с подобной проблемой в последнее время, и решил мое с этим: 2 LOC:

public class VersionControllerSelector : IHttpControllerSelector 

в

public class VersionControllerSelector : DefaultHttpControllerSelector 

... и ...

public VersionControllerSelector(HttpConfiguration config) 

до

public VersionControllerSelector(HttpConfiguration config) : base(config) 
4

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

Ну, Вы должны выполнить следующие шаги:

1) Создание пользовательского ApiExplorer:

public class MyApiExplorer: ApiExplorer 
{ 
    private readonly string _version; 

    public MyApiExplorer(string version) : base(GlobalConfiguration.Configuration) 
    { 
     _version = version != null ? version.ToUpperInvariant() : "V1"; 

     foreach(var apiDescription in ApiDescriptions) 
     { 
      apiDescription.RelativePath = apiDescription.RelativePath.Replace("{version}", _version); 
     } 

    } 

    public override bool ShouldExploreController(string controllerVariableValue, HttpControllerDescriptor controllerDescriptor, 
     IHttpRoute route) 
    { 
     return controllerDescriptor.ControllerType.FullName.Contains(_version); 
    } 

}

а) в конструктор _version будет преобразован в upperCase (только в случае он будет передан как lowerCase), но если он равен нулю, то он будет считать V1 по умолчанию. Затем измените относительный путь, чтобы показать конкретную версию вместо {version}.

b) ShouldExploreController (вкратце) решает, должен ли конкретный контроллер быть отображен в документации. В этот случай мы покажем только контроллерам, что полное имя его типа содержит выбранную версию.

2) Перейти к классу HelpController и изменить метод Index так:

public ActionResult Index(string version) 
{ 
    //... 

    Configuration.Services.Replace(typeof(IApiExplorer), new MyApiExplorer(version)); 

    return View(Configuration.Services.GetApiExplorer().ApiDescriptions); 
} 

Мы заменяем текущий ApiExplorer нашей собственной, чтобы быть возвращается, когда вызов Configuration.Services .GetApiExplorer()

Теперь вы можете использовать это .../help? Version = v1 or .../help? Version = v2 or .../help? Version = v3, и вы получите конкретную документацию контроллера api.

+0

Твердые. Спасибо за инструкцию! – Kevin

+1

Не лучше ли было бы поставить Configuration.Services.Replace в статическом ctor для HelpController? В противном случае это будет вызываться каждый раз. –