web-dev-qa-db-ja.com

Owinの使用時にASP.NETWeb API2ヘルプページを機能させることができません

Web Api2の正しいパッケージをインストールしました

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);

        }
    }
18
DalSoft

たくさんの掘り下げ/試行錯誤の末に解決策を見つけました。この問題はここで詳しく説明されています: http://aspnetwebstack.codeplex.com/discussions/453068

UseWebApiとUseHttpMessageHandlerは、404以外のNext OWINのミドルウェアを呼び出しません。つまり、UseWebApiを使用する場合、Nextは呼び出されないため、他のミドルウェア(NancyやWeb Apiのヘルプページなど)では使用できません。

@aliostadパッチに感謝します: https://github.com/aliostad/CacheCow/blob/master/samples/UsingCacheCowWithNancyAndOwin/HttpMessageHandlerAdapterModified.cs#L4

期待どおりに動作させることができます。 UseWebApiがOwinの設計目標IMOを破ったため、チームがこれに対するプルリクエストをマージすることを願っています。

2014年2月13日更新

これを回避するために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);    
}

2015年7月1日更新

MVCの代わりにWebApiを使用してヘルプページをホストすることもできます。これはセルフホストに最適です http://blogs.msdn.com/b/yaohuang1/archive/2012/12/20/making-asp-net -web-api-help-page-work-on-self-hosted-services.aspx

2015年9月10日更新

Web Apiの場合、@ hongye-Sunの回答を試しましたが、それも機能します。HelpPageAreaRegistration.RegisterAreaとHelpControllerのコンストラクターを変更して、@ gspatelの指示に従ってください。私の回避策も同様に機能するので、状況に最も適したものを選択してください。

ただし、UseWebApiを他のミドルウェアで使用し、Next()を呼び出さない場合でも問題が発生します(IISセルフホストではない)を使用した場合にのみ発生するようです)。パスをマッピングし、次に呼び出されるように強制することは、すべてのOwinミドルウェアNancy、Simple.Webなどの有効な回避策です。

2016年1月13日更新

私はOwinミドルウェアを開発して、この問題を完全に解決する、私たちが知っていて大好きなASP.NET WebAPIヘルプページを生成しました。 私のブログ投稿では、この問題の背景について詳しく説明しています

13
DalSoft

GlobalConfiguration.Configurationは、Webホスト固有のHttpConfiguraitonであり、Webホストシナリオでのみ使用する必要があります。 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に置き換え、ヘルプページファイルを含めます。

32
Hongye Sun