web-dev-qa-db-ja.com

ASP.NET 5でIAppBuilderベースのOwinミドルウェアを使用する方法

ASP.NET 5(aspnet vnext)はKatanaと同様にOWINベースですが、抽象化は異なります。特に、IAppBuilderIApplicationBuilderに置き換えられました。多くのミドルウェアライブラリはIAppBuilderに依存しており、ASP.NET 5をサポートするように更新されていません

APS.NET 5ミドルウェアでこのOWINミドルウェアを使用するにはどうすればよいですか。両方ともOWINベースであるため、可能です。

Microsoft.AspNet.Builder.OwinExtensionsUseOwinメソッドを提供しますが、低レベルのOWIN署名に基づいているため、IAppBuilderを期待するメソッドでは使用できません。

17
vossad01

編集: AspNet.Hosting.Katana.Extensions package を使用できるようになりました。


AppBuilder.DefaultAppを使用するわずかに異なるバージョンを次に示します。

public static IApplicationBuilder UseOwinAppBuilder(this IApplicationBuilder app, Action<IAppBuilder> configuration)
{
    if (app == null)
    {
        throw new ArgumentNullException(nameof(app));
    }

    if (configuration == null)
    {
        throw new ArgumentNullException(nameof(configuration));
    }

    return app.UseOwin(setup => setup(next =>
    {
        var builder = new AppBuilder();
        var lifetime = (IApplicationLifetime) app.ApplicationServices.GetService(typeof(IApplicationLifetime));

        var properties = new AppProperties(builder.Properties);
        properties.AppName = app.ApplicationServices.GetApplicationUniqueIdentifier();
        properties.OnAppDisposing = lifetime.ApplicationStopping;
        properties.DefaultApp = next;

        configuration(builder);

        return builder.Build<Func<IDictionary<string, object>, Task>>();
    }));
}

Microsoft.Owinを参照すると、アプリがdnxcore50(Core CLR)と互換性がなくなることに注意してください。

10
Pinpoint

フレームワークに互換性があるというよく引用されている参照は、 ASP.NET 5でIdentityServer3をサポートするためにThinktectureによって構築された拡張メソッド です。

このメソッドはIdentityServerに固有であり、AspNetパイプラインで後で登録されたミドルウェアによって処理される要求をサポートしません(次のコンポーネントを呼び出しません)。

これにより、これらの欠点に対処するためにメソッドが調整されます。

internal static class IApplicationBuilderExtensions
{
  public static void UseOwin(
    this IApplicationBuilder app,
    Action<IAppBuilder> owinConfiguration )
  {
    app.UseOwin(
      addToPipeline =>
        {
          addToPipeline(
            next =>
              {
                var builder = new AppBuilder();

                owinConfiguration( builder );

                builder.Run( ctx => next( ctx.Environment ) );

                Func<IDictionary<string, object>, Task> appFunc =
                  (Func<IDictionary<string, object>, Task>)
                  builder.Build( typeof( Func<IDictionary<string, object>, Task> ) );

                return appFunc;
              } );
        } );
  }
}

次のように使用できます。

app.UseOwin(
    owin =>
        {
            // Arbitrary IAppBuilder registrations can be placed in this block

            // For example, this extension can be provided by
            // NWebsec.Owin or Thinktecture.IdentityServer3
            owin.UseHsts();
        } );

// ASP.NET 5 components, like MVC 6, will still process the request
// (assuming the request was not handled by earlier middleware)
app.UseMvc();
3
vossad01