Подтвердить что ты не робот

ASP.Net Web Api - ApiExplorer не содержит никаких ApiDescriptions

Я пытаюсь реализовать метод Options в контроллере моей веб-службы, который вернет сообщение, содержащее допустимые методы HTTP для конечной точки URI, связанной с контроллером. Метод "Мои параметры" выглядит примерно так:

public HttpResponseMessage Options()
{
    var resp = new HttpResponseMessage();
    resp.Content = new StringContent("");

    var apiExplorer = GlobalConfiguration.Configuration.Services
        .GetApiExplorer();

    foreach (ApiDescription api in apiExplorer.ApiDescriptions)
    {
        resp.Content.Headers.Add("Allow", api.HttpMethod.Method);
    }

    return resp;
}

Я пробовал описанный выше метод в совершенно новом проекте Web Api (implication: unaltered routing) внутри контроллера с методами Get, Post и Delete. Как и ожидалось, возвращается ответ "Разрешить: GET, POST, DELETE". Однако у меня возникают проблемы с добавлением этого в более крупный проект, над которым я работаю. В более крупном проекте список ApiDescriptions в ApiExplorer не содержит никаких элементов. Почему это? Я подозреваю, что это связано с пользовательской маршрутизацией, которая была реализована, хотя единственной основой для этого подозрения является следующая ссылка:

http://forums.asp.net/t/1821651.aspx/1

Кто-нибудь еще испытал этот пустой список ApiDescription? Если да, то нашли ли вы лекарство?

Примечание. Я использую MCV 4 RC

4b9b3361

Ответ 1

Если вы используете Glimpse, вам может потребоваться отключить его инспектор маршрута:

<glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd">
  <logging level="Off" />
  <tabs>
    <ignoredTypes>
      <add type="Glimpse.AspNet.Tab.Routes, Glimpse.AspNet" />
    </ignoredTypes>
  </tabs>
  <inspectors>
    <ignoredTypes>
      <add type="Glimpse.AspNet.Inspector.RoutesInspector, Glimpse.AspNet" />
    </ignoredTypes>
  </inspectors>
</glimpse>

Glimpse создает RouteProxies, которые прерывают перечисление в HostedHttpRouteCollection: https://github.com/mono/aspnetwebstack/blob/master/src/System.Web.Http.WebHost/Routing/HostedHttpRouteCollection.cs

Я знаю, что ссылка для моно, но то же самое верно для стандартных .Net.

Ответ 2

Вы должны перейти к обновлению RTM WebApi, который был выпущен вчера, а затем проверить недавно выпущенную страницу справки ASP.NET WebApi (Preview), который также был выпущен вчера.

Этот пакет автоматически создает содержимое страницы справки для веб-API на вашем сайте. Посетители страницы помощи могут использовать этот контент, чтобы узнать, как назвать веб-API. Все, созданное на странице справки, полностью настраивается с помощью ASP.NET MVC и Razor.

Он реализует ApiExplorer под обложками.

Ответ 3

Решение этой проблемы заключается в комментировании в ProjectName\Areas\HelpPage\Controllers\HelpController.cs конструкторах, подобных этому:

    public class HelpController : Controller
        {
            private const string ErrorViewName = "Error";

    //        public HelpController()
    //            : this(GlobalConfiguration.Configuration)
    //        {
    //        }

    //        public HelpController(HttpConfiguration config)
    //        {
    //            Configuration = config;
    //        }

            /// <summary>
            /// GlobalConfiguration By default
            /// </summary>
            protected static HttpConfiguration Configuration
            {
                get { return GlobalConfiguration.Configuration; }
            }

            public ActionResult Index()
            {
                ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider();
                return View(Configuration.Services.GetApiExplorer().ApiDescriptions);
            }
....

Конструктор по умолчанию не вызывается;

Второй метод заключается в том, чтобы вставить конструктор по умолчанию, добавив этот атрибут [InjectionConstructor] в конструктор по умолчанию следующим образом:

public class HelpController : Controller
    {
        private const string ErrorViewName = "Error";

         [InjectionConstructor]
        public HelpController()
            : this(GlobalConfiguration.Configuration)
        {
        }

        public HelpController(HttpConfiguration config)
        {
            Configuration = config;
        }

        /// <summary>
        /// GlobalConfiguration By default
        /// </summary>
        protected static HttpConfiguration Configuration { get; private set; }
....