Как использовать промежуточное ПО Owin на базе IAppBuilder в ASP.NET 5

ASP.NET 5 (aspnet vnext) - это OWIN, основанный, как Katana, но имеет разные абстракции. В частности, IAppBuilder был заменен на IApplicationBuilder. Многие библиотеки промежуточного программного обеспечения зависят от IAppBuilder и не были обновлены для поддержки ASP.NET 5

Как использовать это промежуточное ПО OWIN в промежуточном программном обеспечении APS.NET 5. Оба основаны на OWIN, поэтому это должно быть возможно.

Microsoft.AspNet.Builder.OwinExtensions предоставляет метод UseOwin, но он основан на низкоуровневых сигнатурах OWIN, поэтому их нельзя использовать с методами, ожидающими IAppBuilder.

Ответы

Ответ 1

Изменить: теперь вы можете использовать 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).

Ответ 2

Часто цитируемой ссылкой, что рамки совместимы, метод расширения, созданный Thinktecture для поддержки их IdentityServer3 на ASP.NET 5.

Этот метод специфичен для 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();