IIS Tümleşik ardışık düzeninde OWıN ara yazılımıOWIN Middleware in the IIS integrated pipeline

tarafından Praburaj Thiagarajan, Rick Andersonby 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.This article shows how to run OWIN middleware Components (OMCs) in the IIS integrated pipeline, and how to set the pipeline event an OMC runs on. 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.You should review An Overview of Project Katana and OWIN Startup Class Detection before reading this tutorial. Bu öğretici, Rick Anderson ( @RickAndMSFT ), Chris No, Praburaj Thiagarajan ve Howard dierking ( @howard\_Dierking ) tarafından yazılmıştır.This tutorial was written by Rick Anderson ( @RickAndMSFT ), Chris Ross, Praburaj Thiagarajan, and Howard Dierking ( @howard\_dierking ).

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 ).Although OWIN middleware components (OMCs) are primarily designed to run in a server-agnostic pipeline, it is possible to run an OMC in the IIS integrated pipeline as well (classic mode is not supported). 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:An OMC can be made to work in the IIS integrated pipeline by installing the following package from the Package Manager Console (PMC):

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.This means that all application frameworks, even those that are not yet able to run outside of IIS and System.Web, can benefit from existing OWIN middleware components.

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.All of the Microsoft.Owin.Security.* packages shipping with the new Identity System in Visual Studio 2013 (for example: Cookies, Microsoft Account, Google, Facebook, Twitter, Bearer Token, OAuth, Authorization server, JWT, Azure Active directory, and Active directory federation services) are authored as OMCs, and can be used in both self-hosted and IIS-hosted scenarios.

IIS Tümleşik ardışık düzeninde OWıN ara yazılımı nasıl çalıştırılırHow OWIN Middleware Executes in the IIS Integrated Pipeline

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.For OWIN console applications, the application pipeline built using the startup configuration is set by the order the components are added using the IAppBuilder.Use method. 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.That is, the OWIN pipeline in the Katana runtime will process OMCs in the order they were registered using IAppBuilder.Use. 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.In the IIS integrated pipeline the request pipeline consists of HttpModules subscribed to a pre-defined set of the pipeline events such as BeginRequest, AuthenticateRequest, AuthorizeRequest, etc.

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.If we compare an OMC to that of an HttpModule in the ASP.NET world, an OMC must be registered to the correct pre-defined pipeline event. Örneğin, bir istek işlem hattındaki kimlik doğrulayan Terequest aşamasına geldiğinde, HttpModule MyModule çağrılır:For example, the HttpModule MyModule will get invoked when a request comes to the AuthenticateRequest stage in the pipeline:

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.In order for an OMC to participate in this same, event-based execution ordering, the Katana runtime code scans through the startup configuration and subscribes each of the middleware components to an integrated pipeline event. Ö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.For example, the following OMC and registration code enables you to see the default event registration of middleware components. (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.)(For more detailed instructions on creating an OWIN startup class, see OWIN Startup Class Detection.)

  1. Boş bir Web uygulaması projesi oluşturun ve owin2olarak adlandırın.Create an empty web application project and name it owin2.

  2. Paket Yöneticisi konsolundan (PMC), aşağıdaki komutu çalıştırın:From the Package Manager Console (PMC), run the following command:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  3. OWIN Startup Class ekleyin ve Startupadlandırın.Add an OWIN Startup Class and name it Startup. Oluşturulan kodu aşağıdaki kodla değiştirin (değişiklikler vurgulanır):Replace the generated code with the following (the changes are highlighted):

    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.Hit F5 to run the app.

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.The Startup configuration sets up a pipeline with three middleware components, the first two displaying diagnostic information and the last one responding to events (and also displaying diagnostic information). 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.The PrintCurrentIntegratedPipelineStage method displays the integrated pipeline event this middleware is invoked on and a message. Çıkış pencereleri aşağıdakileri görüntüler:The output windows displays the following:

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.The Katana runtime mapped each of the OWIN middleware components to PreExecuteRequestHandler by default, which corresponds to the IIS pipeline event PreRequestHandlerExecute.

Aşama IşaretçileriStage Markers

IAppBuilder UseStageMarker() uzantısı yöntemini kullanarak, işlem hattının belirli aşamalarını yürütmek üzere OMCs 'yi işaretleyebilirsiniz.You can mark OMCs to execute at specific stages of the pipeline by using the IAppBuilder UseStageMarker() extension method. 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.To run a set of middleware components during a particular stage, insert a stage marker right after the last component is the set during registration. İş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).There are rules on which stage of the pipeline you can execute middleware and the order components must run (The rules are explained later in the tutorial). UseStageMarker yöntemini aşağıda gösterildiği gibi Configuration koduna ekleyin:Add the UseStageMarker method to the Configuration code as shown below:

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.The app.UseStageMarker(PipelineStage.Authenticate) call configures all the previously registered middleware components (in this case, our two diagnostic components) to run on the authentication stage of the pipeline. Son ara yazılım bileşeni (Tanılamayı ve isteklerin yanıt verdiğini gösterir) ResolveCache aşamada ( ResolveRequestCache olayı) çalışır.The last middleware component (which displays diagnostics and responds to requests) will run on the ResolveCache stage (the ResolveRequestCache event).

Uygulamayı çalıştırmak için F5 'e basın. Çıkış penceresinde aşağıdakiler gösterilir:Hit F5 to run the app.The output window shows the following:

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ıStage Marker Rules

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:Owin middleware components (OMC) can be configured to run at the following OWIN pipeline stage events:

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).By default, OMCs run at the last event (PreHandlerExecute). İlk örnek kodumuz "PreExecuteRequestHandler" olarak görüntülendi.That's why our first example code displayed "PreExecuteRequestHandler".

  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.You can use the a app.UseStageMarker method to register a OMC to run earlier, at any stage of the OWIN pipeline listed in the PipelineStage enum.

  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.The OWIN pipeline and the IIS pipeline is ordered, therefore calls to app.UseStageMarker must be in order. Olay işleyicisini, app.UseStageMarkeriçin kaydedilen son olaydan önce gelen bir olaya ayarlayamazsınız.You cannot set the event handler to an event that precedes the last event registered with to app.UseStageMarker. Örneğin, öğesini çağırdıktan sonra :For example, after calling:

    app.UseStageMarker(PipelineStage.Authorize);
    

    Authenticate veya PostAuthenticate geçirme app.UseStageMarker çağrılar kabul edilmez ve hiçbir özel durum oluşturulmaz.calls to app.UseStageMarker passing Authenticate or PostAuthenticate will not be honored, and no exception will be thrown. OMCs, varsayılan olarak PreHandlerExecuteen son aşamada çalışır.OMCs run at the latest stage, which by default is PreHandlerExecute. Aşama işaretçileri, daha önce çalıştırılmasını sağlamak için kullanılır.The stage markers are used to make them to run earlier. Aşama işaretlerini sıra dışında belirtirseniz, önceki İşaretleyiciye yuvarlıyoruz.If you specify stage markers out of order, we round to the earlier marker. Diğer bir deyişle, aşama işaretleyicisi eklemek "Aşama X 'ten sonra Hayır" ifadesini ifade ediyor.In other words, adding a stage marker says "Run no later than stage X". OMC 'nin, OWıN ardışık düzeninde olduktan sonra, ilk aşama işaretçisi üzerinde çalışması.OMC's run at the earliest stage marker added after them in the OWIN pipeline.

  4. app.UseStageMarker WINS için en erken çağrı aşaması.The earliest stage of calls to app.UseStageMarker wins. Örneğin, önceki örneğimizdeki app.UseStageMarker çağrılarının sırasını değiştirirseniz:For example, if you switch the order of app.UseStageMarker calls from our previous example:

    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:The output window will display:

    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.The OMCs all run in the AuthenticateRequest stage, because the last OMC registered with the Authenticate event, and the Authenticate event precedes all other events.