Как использовать промежуточное ПО 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();