Aracılığıyla paylaş


IIS tümleşik işlem hattında OWIN Ara Yazılımı

Tarafından Praburaj Thiagarajan, Rick Anderson

Bu makalede, IIS tümleşik işlem hattında OWIN ara yazılım Bileşenlerinin (OMC) nasıl çalıştırlanacağı ve OMC'nin üzerinde çalıştığı işlem hattı olayının nasıl ayarlanacağı gösterilmektedir. Bu öğreticiyi okumadan önce Project Katana ve OWIN Başlangıç Sınıfı Algılamaya Genel Bakış'ı gözden geçirmelisiniz. Bu öğretici Rick Anderson ( @RickAndMSFT ), Chris Ross, Praburaj Thiagarajan ve Howard Dierking ( @howard_dierking ) tarafından yazılmıştır.

OWIN ara yazılım bileşenleri (OMC'ler) öncelikli olarak sunucudan bağımsız bir işlem hattında çalışacak şekilde tasarlanmış olsa da, IIS tümleşik işlem hattında da bir OMC çalıştırmak mümkündür (klasik mod desteklenmez). Paket Yöneticisi Konsolu'ndan (PMC) aşağıdaki paketi yükleyerek IIS tümleşik işlem hattında çalışacak bir OMC oluşturulabilir:

Install-Package Microsoft.Owin.Host.SystemWeb

Bu, IIS ve System.Web dışında çalıştırılamayanlar bile tüm uygulama çerçevelerinin mevcut OWIN ara yazılım bileşenlerinden yararlanabileceği anlamına gelir.

Not

Microsoft.Owin.Security.* Visual Studio 2013'da yeni Kimlik Sistemi ile gönderilen tüm paketler (örneğin: Tanımlama bilgileri, Microsoft Hesabı, Google, Facebook, Twitter, Taşıyıcı Belirteç, OAuth, Yetkilendirme sunucusu, JWT, Azure Active Directory ve Active Directory federasyon hizmetleri) OMC olarak yazılır ve hem şirket içinde barındırılan hem de IIS tarafından barındırılan senaryolarda kullanılabilir.

OWIN Ara Yazılımı IIS Tümleşik İşlem Hattında Nasıl Yürütülür?

OWIN konsol uygulamaları için, başlangıç yapılandırması kullanılarak oluşturulan uygulama işlem hattı, bileşenlerin yöntemi kullanılarak eklenme sırasına IAppBuilder.Use göre ayarlanır. Yani , Katana çalışma zamanındaki OWIN işlem hattı, OMC'leri kullanılarak IAppBuilder.Usekaydedildikleri sırayla işler. IIS tümleşik işlem hattında istek işlem hattı BeginRequest, AuthenticateRequest, AuthorizeRequest gibi işlem hattı olaylarının önceden tanımlanmış bir kümesine abone olan HttpModule'lerden oluşur. Microsoft.Owin.Host.SystemWeb nuget paketinin öğesini kaydettiğinize OwinHttpModuledikkat edin. Genellikle dosya HttpModule aracılığıyla Web.config IIS'ye kaydedilir, ancak Microsoft.Owin.Host.SystemWeb ve HttpApplication.RegisterModule(Type) adlı PreApplicationStartMethodAttribute bir IIS özelliğini kullanarak iis işlem hattına OwinHttpModule dinamik olarak kaydedilir.

OMC'yi ASP.NET dünyadaki bir HttpModule ile karşılaştırırsak, OMC'nin önceden tanımlanmış doğru işlem hattı olayına kaydedilmesi gerekir. Örneğin, işlem hattındaki AuthenticateRequest aşamasına bir istek geldiğinde HttpModule MyModule çağrılır:

public class MyModule : IHttpModule
{
    public void Dispose()
    {
        //clean-up code here.
    }
    public void Init(HttpApplication context)
    {
        // An example of how you can handle AuthenticateRequest events.
        context.AuthenticateRequest += ctx_AuthRequest;
    }
    void ctx_AuthRequest(object sender, EventArgs e)
    {
        // Handle event.
    }
}

Bir OMC'nin aynı olay tabanlı yürütme sıralamasına katılması için Katana çalışma zamanı kodu başlangıç yapılandırmasında tarar ve ara yazılım bileşenlerinin her birini tümleşik bir işlem hattı olayına abone eder. Örneğin, aşağıdaki OMC ve kayıt kodu ara yazılım bileşenlerinin varsayılan olay kaydını görmenizi sağlar. (OWIN başlangıç sınıfı oluşturma hakkında daha ayrıntılı yönergeler için bkz. OWIN Başlangıç Sınıfı Algılama.)

  1. Boş bir web uygulaması projesi oluşturun ve owin2 olarak adlandırabilirsiniz.

  2. Paket Yöneticisi Konsolu'ndan (PMC) aşağıdaki komutu çalıştırın:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  3. bir OWIN Startup Class ekleyin ve olarak adlandırlayın Startup. Oluşturulan kodu aşağıdakilerle değiştirin (değişiklikler vurgulanır):

    using System;
    using System.Threading.Tasks;
    using Microsoft.Owin;
    using Owin;
    using System.Web;
    using System.IO;
    using Microsoft.Owin.Extensions;
    [assembly: OwinStartup(typeof(owin2.Startup))]
    namespace owin2
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.Use((context, next) =>
                {
                    PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
                    return next.Invoke();
                });
                app.Use((context, next) =>
                {
                    PrintCurrentIntegratedPipelineStage(context, "2nd MW");
                    return next.Invoke();
                }); 
                app.Run(context =>
                {
                    PrintCurrentIntegratedPipelineStage(context, "3rd MW");
                    return context.Response.WriteAsync("Hello world");
                });            
            }
            private void PrintCurrentIntegratedPipelineStage(IOwinContext context, string msg)
            {
                var currentIntegratedpipelineStage = HttpContext.Current.CurrentNotification;
                context.Get<TextWriter>("host.TraceOutput").WriteLine(
                    "Current IIS event: " + currentIntegratedpipelineStage
                    + " Msg: " + msg);
            }
        }
    }
    
  4. Uygulamayı çalıştırmak için F5'e basın.

Başlangıç yapılandırması, ilk ikisi tanılama bilgilerini görüntüleyen ve son ikisi de olaylara yanıt veren (ve tanılama bilgilerini görüntüleyen) üç ara yazılım bileşeniyle bir işlem hattı ayarlar. yöntemi, PrintCurrentIntegratedPipelineStage bu ara yazılımının çağrıldığı tümleşik işlem hattı olayını ve bir iletiyi görüntüler. Çıkış pencereleri aşağıdakileri görüntüler:

Current IIS event: PreExecuteRequestHandler Msg: Middleware 1
Current IIS event: PreExecuteRequestHandler Msg: 2nd MW
Current IIS event: PreExecuteRequestHandler Msg: 3rd MW

Katana çalışma zamanı, OWIN ara yazılım bileşenlerinin her birini varsayılan olarak PreExecuteRequestHandler ile eşledi ve bu da PreRequestHandlerExecute IIS işlem hattı olayına karşılık gelir.

Aşama İşaretçileri

Uzantı yöntemini kullanarak işlem hattının belirli aşamalarında yürütülecek OMC'leri IAppBuilder UseStageMarker() işaretleyebilirsiniz. Belirli bir aşamada ara yazılım bileşenleri kümesini çalıştırmak için, kayıt sırasında ayarlanan son bileşenden hemen sonra bir aşama işaretçisi ekleyin. İşlem hattının hangi aşamasında ara yazılımı yürütebileceğiniz ve sipariş bileşenlerinin çalıştırılması gereken kurallar vardır (Kurallar öğreticinin ilerleyen bölümlerinde açıklanmıştır). UseStageMarker Aşağıda gösterildiği gibi yöntemini koda Configuration ekleyin:

public void Configuration(IAppBuilder app)
{
    app.Use((context, next) =>
    {
        PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
        return next.Invoke();
    });
    app.Use((context, next) =>
    {
        PrintCurrentIntegratedPipelineStage(context, "2nd MW");
        return next.Invoke();
    });
    app.UseStageMarker(PipelineStage.Authenticate);
    app.Run(context =>
    {
        PrintCurrentIntegratedPipelineStage(context, "3rd MW");
        return context.Response.WriteAsync("Hello world");
    });
    app.UseStageMarker(PipelineStage.ResolveCache);
}

Çağrısı, app.UseStageMarker(PipelineStage.Authenticate) önceden kaydedilmiş tüm ara yazılım bileşenlerini (bu örnekte iki tanılama bileşenimiz) işlem hattının kimlik doğrulama aşamasında çalışacak şekilde yapılandırmaktadır. Son ara yazılım bileşeni (tanılamaları görüntüler ve isteklere yanıt verir) aşamada çalışır ResolveCache ( ResolveRequestCache olayı).

Uygulamayı çalıştırmak için F5'e basın. Çıkış penceresinde aşağıdakiler gösterilir:

Current IIS event: AuthenticateRequest Msg: Middleware 1
Current IIS event: AuthenticateRequest Msg: 2nd MW
Current IIS event: ResolveRequestCache Msg: 3rd MW

Aşama İşaretçi Kuralları

Owin ara yazılım bileşenleri (OMC), aşağıdaki OWIN işlem hattı aşama olaylarında çalışacak şekilde yapılandırılabilir:

public enum PipelineStage
{
    Authenticate = 0,
    PostAuthenticate = 1,
    Authorize = 2,
    PostAuthorize = 3,
    ResolveCache = 4,
    PostResolveCache = 5,
    MapHandler = 6,
    PostMapHandler = 7,
    AcquireState = 8,
    PostAcquireState = 9,
    PreHandlerExecute = 10,
}
  1. Varsayılan olarak, OMC'ler son olayda (PreHandlerExecute) çalışır. bu nedenle ilk örnek kodumuzda "PreExecuteRequestHandler" görüntülendi.

  2. OWIN işlem hattının app.UseStageMarker enum'da listelenen PipelineStage herhangi bir aşamasında daha önce çalıştırmak üzere bir OMC kaydetmek için yöntemini kullanabilirsiniz.

  3. OWIN işlem hattı ve IIS işlem hattı sıralanır, bu nedenle çağrısının app.UseStageMarker sırayla olması gerekir. Olay işleyicisini, ile kaydedilen son olaydan önce gelen bir olaya ayarlayamazsınız app.UseStageMarker. Örneğin, çağrıldıktan sonra :

    app.UseStageMarker(PipelineStage.Authorize);
    

    veya PostAuthenticate geçirme Authenticate çağrıları app.UseStageMarker gerçekleştirilmeyecek ve hiçbir özel durum oluşturulmayacak. OMC'ler varsayılan olarak olan PreHandlerExecuteen son aşamada çalışır. Aşama işaretçileri, bunları daha önce çalışacak şekilde yapmak için kullanılır. Aşama işaretleyicilerini sıra dışı olarak belirtirseniz, önceki işaretçiye yuvarlarız. Başka bir deyişle, aşama işaretçisi eklendiğinde "X aşamasından sonra çalıştır" ifadesi yer alır. OMC'nin OWIN işlem hattında ardına eklenen en erken aşama işaretçisindeki çalıştırması.

  4. Çağrıların app.UseStageMarker en erken aşaması kazanır. Örneğin, önceki örneğimizden gelen aramaların app.UseStageMarker sırasını değiştirirseniz:

    public void Configuration(IAppBuilder app)
    {
        app.Use((context, next) =>
        {
            PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
            return next.Invoke();
        });
        app.Use((context, next) =>
        {
            PrintCurrentIntegratedPipelineStage(context, "2nd MW");
            return next.Invoke();
        });
        app.UseStageMarker(PipelineStage.ResolveCache);
        app.Run(context =>
        {
            PrintCurrentIntegratedPipelineStage(context, "3rd MW");
            return context.Response.WriteAsync("Hello world");
        });
        app.UseStageMarker(PipelineStage.Authenticate);
    }
    

    Çıkış penceresi şunları görüntüler:

    Current IIS event: AuthenticateRequest Msg: Middleware 1
    Current IIS event: AuthenticateRequest Msg: 2nd MW
    Current IIS event: AuthenticateRequest Msg: 3rd MW
    

    OMC'lerin AuthenticateRequest tümü, olayla Authenticate kaydedilen son OMC ve Authenticate diğer tüm olaylardan önce geldiği için aşamada çalışır.