IIS Tümleşik ardışık düzeninde OWıN ara yazılımı

tarafından Praburaj Thiagarajan, Rick Anderson

Bu makalede, IIS Tümleşik ardışık düzeninde OWıN ara yazılım bileşenlerinin (OMCs) çalıştırılması ve bir OMC 'nin üzerinde çalıştığı işlem hattı olayının nasıl ayarlanacağı gösterilmektedir. Bu öğreticiyi okumadan önce proje Katana ve Owın başlangıç sınıfı algılamasına Ilişkin bir genel bakışı gözden geçirmeniz gerekir. Bu öğretici, Rick Anderson ( @RickAndMSFT ), Chris No, Praburaj Thiagarajan ve Howard dierking ( @howard_Dierking ) tarafından yazılmıştır.

Owın ara yazılım bileşenleri (OMCS) öncelikle sunucu belirsiz işlem hattında çalışacak şekilde tasarlansa da, IIS Tümleşik ardışık düzeninde bir OMC çalıştırmak mümkündür (Klasik mod desteklenmez ). Paket Yöneticisi konsolundan (PMC) aşağıdaki paketi yükleyerek IIS Tümleşik işlem hattında çalışan bir OMC yapılabilir:

Install-Package Microsoft.Owin.Host.SystemWeb

Bu, henüz IIS ve System. Web dışında çalıştırılmayan tüm uygulama çerçevelerinin, var olan OWıN ara yazılım bileşenlerinden faydalanabileceği anlamına gelir.

Note

Microsoft.Owin.Security.* paketlerin tümü, Visual Studio 2013 yeni kimlik sistemiyle (örneğin: tanımlama bilgileri, Microsoft hesabı, Google, Facebook, Twitter, taşıyıcı belirteci, OAuth, yetkilendirme sunucusu, JWT, Azure Active Directory ve Active Directory Federasyon Hizmetleri), OMCS olarak yazılır ve hem şirket içinde hem de IIS tarafından barındırılan senaryolarda kullanılabilir.

IIS Tümleşik ardışık düzeninde OWıN ara yazılımı nasıl çalıştırılır

OWıN konsol uygulamaları için, Başlangıç yapılandırması kullanılarak oluşturulan uygulama ardışık düzeni, bileşenlerin IAppBuilder.Use yöntemi kullanılarak eklendiği sıraya göre ayarlanır. Diğer bir deyişle, Katana çalışma zamanındaki owın ardışık düzeni, OMCS 'yi, IAppBuilder.Usekullanılarak kaydedildikleri sırada işler. IIS Tümleşik işlem hattında, istek ardışık düzeni, BeginRequest, doğruıbota, AuthorizeRequestgibi işlem hattı olaylarının önceden tanımlanmış bir kümesine abone olan httpModules 'tan oluşur.

Bir OMC 'yi ASP.NET dünyasında bir HttpModule ile karşılaştırdığımızda, BIR OMC 'nin doğru önceden tanımlanmış ardışık düzen olayına kayıtlı olması gerekir. Örneğin, bir istek işlem hattındaki kimlik doğrulayan Terequest aşamasına 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 bu aynı olay tabanlı yürütme sıralamasına katılmasını sağlamak için, Katana çalışma zamanı kodu başlangıç yapılandırmasını tarar ve her bir ara yazılım bileşeninin her birini tümleşik bir ardışık düzen olayına abone olur. Ö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. (Bir OWıN başlangıç sınıfı oluşturma hakkında daha ayrıntılı yönergeler için bkz. Owın başlangıç sınıfı algılama.)

  1. Boş bir Web uygulaması projesi oluşturun ve owin2olarak adlandırın.

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

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  3. OWIN Startup Class ekleyin ve Startupadlandırın. Oluşturulan kodu aşağıdaki kodla 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ı üç ara yazılım bileşeni olan bir işlem hattını ayarlar, ilk iki, tanılama bilgilerini ve en son bir olay yanıt vermeyi (ve ayrıca tanılama bilgilerini görüntüler) görüntüler. PrintCurrentIntegratedPipelineStage yöntemi, bu ara yazılımı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ı, OWıN ara yazılım bileşenlerinden her birini varsayılan olarak Preexecuterequesthandler ile EŞLEŞTIREREK IIS işlem hattı Event PreRequestHandlerExecute'a karşılık gelir.

Aşama Işaretçileri

IAppBuilder UseStageMarker() uzantısı yöntemini kullanarak, işlem hattının belirli aşamalarını yürütmek üzere OMCs 'yi işaretleyebilirsiniz. Belirli bir aşamada bir ara yazılım bileşenleri kümesi çalıştırmak için, kayıt sırasında ayarlanan son bileşenden hemen sonra bir aşama işareti ekleyin. İşlem hattının hangi aşamasında ara yazılım yürütebileceği ve sipariş bileşenlerinin çalışması gereken kurallar vardır (kurallar Öğreticinin ilerleyen kısımlarında açıklanmıştır). UseStageMarker yöntemini aşağıda gösterildiği gibi Configuration koduna 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);
}

app.UseStageMarker(PipelineStage.Authenticate) çağrısı, daha önce kaydedilen tüm ara yazılım bileşenlerini (Bu durumda, iki tanılama bileşenimizin) işlem hattının kimlik doğrulama aşamasında çalışacak şekilde yapılandırır. Son ara yazılım bileşeni (Tanılamayı ve isteklerin yanıt verdiğini gösterir) ResolveCache aşamada ( ResolveRequestCache olayı) çalışır.

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 Işaretçisi kuralları

Owın ara yazılım bileşenleri (OMC), aşağıdaki OWIN ardışık düzen aşaması 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, OMCs son olayda çalışır (PreHandlerExecute). İlk örnek kodumuz "PreExecuteRequestHandler" olarak görüntülendi.

  2. Bir OMC 'yi daha önce çalıştırmak üzere kaydetmek için bir app.UseStageMarker yöntemini kullanabilirsiniz. Bu işlem, PipelineStage numaralandırmasında listelenen OWıN işlem hattının herhangi bir aşamasında.

  3. OWıN ardışık düzeni ve IIS işlem hattı sıralanmıştır, bu nedenle app.UseStageMarker çağrıları sırayla olmalıdır. Olay işleyicisini, app.UseStageMarkeriçin kaydedilen son olaydan önce gelen bir olaya ayarlayamazsınız. Örneğin, öğesini çağırdıktan sonra :

    app.UseStageMarker(PipelineStage.Authorize);
    

    Authenticate veya PostAuthenticate geçirme app.UseStageMarker çağrılar kabul edilmez ve hiçbir özel durum oluşturulmaz. OMCs, varsayılan olarak PreHandlerExecuteen son aşamada çalışır. Aşama işaretçileri, daha önce çalıştırılmasını sağlamak için kullanılır. Aşama işaretlerini sıra dışında belirtirseniz, önceki İşaretleyiciye yuvarlıyoruz. Diğer bir deyişle, aşama işaretleyicisi eklemek "Aşama X 'ten sonra Hayır" ifadesini ifade ediyor. OMC 'nin, OWıN ardışık düzeninde olduktan sonra, ilk aşama işaretçisi üzerinde çalışması.

  4. app.UseStageMarker WINS için en erken çağrı aşaması. Örneğin, önceki örneğimizdeki app.UseStageMarker çağrılarının 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 görüntülenir:

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

    OMCs, AuthenticateRequest aşamada çalışır, çünkü son OMC Authenticate olayına kaydedilir ve Authenticate olayı diğer tüm olayların önüne geçer.