2014-08-28 2 views
4

У меня есть несколько методов в моем WebApi, которые возвращают HttpResponseMessage. Поскольку тип ответа неизвестно, я должен зарегистрировать их в HelpPageConfig используя что-то вродеASP.NET WebAPI - Как сканировать зарегистрированные действия

config.SetActualResponseType(typeof(X), "SomeController", "GetX");

Я хотел бы зарегистрировать их, используя пользовательский атрибут [ActualResponse(typeof(X)] где объявлен контроллер, чтобы избежать создания большого объекта реестра, который ссылается на все в немного беспорядочном списке.

Как я могу допросить конфигурацию, чтобы получить список зарегистрированных контроллеров и действий и их атрибутов, чтобы я мог автоматически вызвать SetActualResponseType?

ответ

0

Я изучил источники mvc и web api и не нашел места, где вы можете ввести такую ​​логику. Поиск методов действий в mvc/web api - непростая задача, потому что существует ряд проверок, которые определяют, является ли метод действием методом или просто обычным методом (на основе зарегистрированных маршрутов и т. Д.). В вашем случае вам нужно обрабатывать только методы с вашим пользовательским атрибутом ActualResponse, не так ли? Таким образом, вы можете сделать это с отражением. Конечно, такие вещи не бывают быстрыми и приносят некоторый удар производительности. Но если вы запускаете такую ​​логику один раз на Application_Start, я думаю, что это приемлемо.

Пример реализации:

public static class ActionMethodsRegistrator 
{ 
    private static readonly Type ApiControllerType = typeof(IHttpController); 

    public static void RegisterActionMethods(YourCustomConfig config) 
    { 
     // find all api controllers in executing assembly    
     var contollersTypes = Assembly.GetExecutingAssembly().GetTypes() 
      .Where(foundType => ApiControllerType.IsAssignableFrom(foundType)); 

     // you may also search for controllers in all loaded assemblies e.g. 
     // var contollersTypes = AppDomain.CurrentDomain.GetAssemblies() 
     // .SelectMany(s => s.GetTypes()) 
     // .Where(foundType => ApiControllerType.IsAssignableFrom(foundType));     

     foreach (var contollerType in contollersTypes) 
     { 
      // you may add more restriction here for optimization, e. g. BindingFlags.DeclaredOnly 
      // I took search parameters from mvc/web api sources. 
      var allMethods = contollerType.GetMethods(BindingFlags.Instance | BindingFlags.Public); 

      foreach (var methodInfo in allMethods) 
      { 
       var actualResponseAttrubute = methodInfo.GetCustomAttribute<ActualResponseAttribute>(); 
       if (actualResponseAttrubute != null) 
       {      
        config.SetActualResponseType(actualResponseAttrubute.Type, contollerType.Name, methodInfo.Name);       
       } 
      } 
     } 
    } 
} 

Global.asax файл:

protected void Application_Start() 
    { 
     //.... 
     YourCustomConfig config = InitializeConfig(); 
     ActionMethodsRegistrator.RegisterActionMethods(config); 
    } 
+0

Спасибо - я думал, что может быть способ, в ApiExplorer, которые могли бы работать, но он был пуст при инициализации. – mcintyre321

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