Не удается получить страницы справки ASP.NET Web API 2, работающие при использовании Owin

Я установил правильный пакет для Web Api 2

Install-Package Microsoft.AspNet.WebApi.HelpPage -Pre 

Но область справки не отображается и возвращается 404 (Web Api работает нормально). Я использую Microsoft.Owin.Host.SystemWeb как хост. Ниже приведен код запуска.

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            //Required for MVC areas new HttpConfiguration() doesn't work with MVC
            var config = GlobalConfiguration.Configuration;

            AreaRegistration.RegisterAllAreas();

            WepApiStartup.Configure(config);

            app.UseWebApi(config);

        }
    }

Ответы

Ответ 1

Нашел решение после многократного поиска/проб и ошибок. Проблема хорошо описана здесь: http://aspnetwebstack.codeplex.com/discussions/453068

UseWebApi и UseHttpMessageHandler не вызывают следующее промежуточное ПО OWIN, отличное от 404. Это означает, что если вы используете UseWebApi, то он никогда не вызывается, поэтому вы не можете использовать его с каким-либо другим промежуточным программным обеспечением (страницы поддержки Nancy или Web Api для пример).

Благодаря патчу @aliostad: https://github.com/aliostad/CacheCow/blob/master/samples/UsingCacheCowWithNancyAndOwin/HttpMessageHandlerAdapterModified.cs#L43

Вы можете заставить его работать как ожидалось. Я надеюсь, что команда объединит запрос на растяжение для этого, поскольку UseWebApi нарушает цели дизайна Owin IMO.

Обновление 13 февраля 2014 г.

Я написал расширение Owin, чтобы обойти это:

internal static void UseWebApiAndHelp(this IAppBuilder app, HttpConfiguration config)
{
    WepApiStartup.Configure(config);

    app.UseHandlerAsync((request, response, next) =>
    {
        if (request.Path == "/") //app.Map using a regex exclude list would be better here so it doesn't fire for every request
        {
            response.StatusCode = 301;
            response.SetHeader("Location", "/Help");
            return Task.FromResult(0);
        }

        return next();
    });

    // Map the help path and force next to be invoked
    app.Map("/help", appbuilder => appbuilder.UseHandlerAsync((request, response, next) => next()));

    app.UseWebApi(config);    
}

Обновление 01 июля 2015

Вы также можете размещать страницы справки, используя WebApi вместо MVC, что отлично подходит для самостоятельного хоста http://blogs.msdn.com/b/yaohuang1/archive/2012/12/20/making-asp-net-web-api-help-page-work-on-self-hosted-services.aspx

Обновление 10 сентября 2015 г.

Для Web Api я попробовал @hongye-sun ответ, и он тоже работает, следуйте тому, что говорит @gspatel, изменяя HelpPageAreaRegistration.RegisterArea и конструктор HelpController. Мое обходное решение работает так, чтобы выбрать то, что лучше всего подходит для вашей ситуации.

Однако я все еще сталкиваюсь с проблемой использования UseWebApi с другим промежуточным программным обеспечением, и он не вызывает Next() (похоже, это происходит только при использовании IIS, а не для самого хоста). Я нашел, что обходной путь для сопоставления пути и принудительного запуска рядом с ним является допустимым обходным решением для всех промежуточных программ Owin Nancy, Simple.Web и т.д.

Обновление 13 января 2016 г.

Я разработал промежуточное ПО Owin для создания страниц справки ASP.NET Web API, которые мы знаем и любим, что полностью решает эту проблему. В моем блоге подробно рассказывается об этой проблеме

Ответ 2

GlobalConfiguration.Configuration - это веб-хост, специфичный для HttpConfiguraiton, который должен использоваться только с сценарием веб-хоста. Использование его с хостом OWIN вызовет неожиданные проблемы.

Вместо этого используйте следующий код:

public class Startup
{
    public static HttpConfiguration HttpConfiguration { get; private set; }

    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration = new HttpConfiguration();

        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(HttpConfiguration);

        app.UseWebApi(HttpConfiguration);
    }
}

Заменить все GlobalConfiguration.Configuration с помощью Startup.HttpConfiguration в проекте включают файлы справки.