По промежуточного слоя OWIN в интегрированном конвейере IISOWIN Middleware in the IIS integrated pipeline

Прабураж сиагаражан, Рик Андерсон (by Praburaj Thiagarajan, Rick Anderson

В этой статье показано, как запускать компоненты по промежуточного слоя OWIN (ОМКС) в конвейере, интегрированном со службами IIS, и как задать событие конвейера, на котором выполняется ОМК.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. Прежде чем читать этот учебник, ознакомьтесь с обзором определения класса Katana и типа запуска OWIN .You should review An Overview of Project Katana and OWIN Startup Class Detection before reading this tutorial. Этот учебник написан на Рик Андерсон (( @RickAndMSFT ), Крис Росс (, прабураж Сиагаражан и Говард дайеркинг ( @howard\_Дайеркинг ).This tutorial was written by Rick Anderson ( @RickAndMSFT ), Chris Ross, Praburaj Thiagarajan, and Howard Dierking ( @howard\_dierking ).

Хотя компоненты промежуточного слоя OWIN (ОМКС) в основном предназначены для работы в независимом от сервера конвейере, в интегрированном конвейере IIS можно также запустить ОМК (классический режим не поддерживается).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). ОМК можно сделать для работы в конвейере, интегрированном со службами IIS, установив следующий пакет из консоли диспетчера пакетов (PMC):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

Это означает, что все платформы приложений, даже те, которые еще не могут работать вне IIS и System. Web, могут воспользоваться преимуществами существующих компонентов по промежуточного слоя OWIN.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.* пакеты, поставляемые с новой системой идентификации в Visual Studio 2013 (например, файлы cookie, учетная запись Майкрософт, Google, Facebook, Twitter, маркер носителя, OAuth, сервер авторизации, JWT, Azure Active Directory и службы федерации Active Directory), создаются как Омкс и могут использоваться как в самостоятельно размещенных, так и в размещенных в IIS сценариях.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.

Как выполняется по промежуточного слоя OWIN в интегрированном конвейере IISHow OWIN Middleware Executes in the IIS Integrated Pipeline

Для консольных приложений OWIN конвейер приложений, созданный с помощью конфигурации запуска , задается порядком добавления компонентов с помощью метода IAppBuilder.Use.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. То есть конвейер OWIN в среде выполнения Katana будет обрабатывать Омкс в том порядке, в котором они были зарегистрированы с помощью IAppBuilder.Use.That is, the OWIN pipeline in the Katana runtime will process OMCs in the order they were registered using IAppBuilder.Use. В конвейере интеграции IIS конвейер запросов состоит из HttpModule , подписанных на предварительно определенный набор событий конвейера, таких как beginRequest, AuthenticateRequest, AuthorizeRequestи т. д.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.

Если сравнить ОМК с объектом HttpModule в ASP.NET мире, то ОМК должен быть зарегистрирован в правильном предварительно определенном событии конвейера.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. Например, MyModule HttpModule будет вызываться, когда запрос поступает на стадию AuthenticateRequest в конвейере: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.
    }
}

Чтобы ОМК мог участвовать в таком же порядке выполнения на основе событий, код среды выполнения Katana просматривает конфигурацию запуска и подписывает каждый из компонентов по промежуточного слоя в интегрированное событие конвейера.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. Например, следующий ОМК и код регистрации позволяют просматривать регистрацию событий по умолчанию для компонентов по промежуточного слоя.For example, the following OMC and registration code enables you to see the default event registration of middleware components. (Более подробные инструкции по созданию класса запуска OWIN см. в разделе Обнаружение класса запуска OWIN.)(For more detailed instructions on creating an OWIN startup class, see OWIN Startup Class Detection.)

  1. Создайте пустой проект веб-приложения и назовите его owin2.Create an empty web application project and name it owin2.

  2. В консоли диспетчера пакетов (PMC) выполните следующую команду:From the Package Manager Console (PMC), run the following command:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  3. Добавьте OWIN Startup Class и присвойте ему имя Startup.Add an OWIN Startup Class and name it Startup. Замените созданный код следующим (изменения выделены):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. Нажмите клавишу F5, чтобы запустить приложение.Hit F5 to run the app.

Конфигурация запуска настраивает конвейер с тремя компонентами по промежуточного слоя, первые два отображения диагностических сведений и Последнее реагирование на события (а также отображение диагностической информации).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 отображает событие интегрированного конвейера, которое вызывается этим по промежуточного слоя и сообщением.The PrintCurrentIntegratedPipelineStage method displays the integrated pipeline event this middleware is invoked on and a message. Выходные окна выводят следующие данные: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 сопоставила каждый из компонентов по промежуточного слоя OWIN в приксекутерекуессандлер по умолчанию, что соответствует событию конвейера IIS PreRequestHandlerExecute.The Katana runtime mapped each of the OWIN middleware components to PreExecuteRequestHandler by default, which corresponds to the IIS pipeline event PreRequestHandlerExecute.

Маркеры этапаStage Markers

Можно пометить Омкс для выполнения на конкретных стадиях конвейера с помощью метода расширения IAppBuilder UseStageMarker().You can mark OMCs to execute at specific stages of the pipeline by using the IAppBuilder UseStageMarker() extension method. Чтобы запустить набор компонентов по промежуточного слоя на определенном этапе, вставьте маркер этапа сразу после последнего компонента, установленного во время регистрации.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. Существуют правила, на которых этап конвейера можно выполнить по промежуточного слоя и компоненты заказа, которые должны быть выполнены (правила объясняются далее в этом руководстве).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 в код Configuration, как показано ниже: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) вызов настраивает все ранее зарегистрированные компоненты по промежуточного слоя (в данном случае два компонента диагностики) для запуска на этапе проверки подлинности конвейера.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. Последний компонент по промежуточного слоя (который отображает диагностику и реагирует на запросы) будет выполняться на ResolveCache этапе (событие ресолверекуесткаче ).The last middleware component (which displays diagnostics and responds to requests) will run on the ResolveCache stage (the ResolveRequestCache event).

Нажмите клавишу F5, чтобы запустить приложение. В окне Вывод отображается следующее: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

Правила маркера этапаStage Marker Rules

Компоненты промежуточного слоя Owin (ОМК) можно настроить для запуска в следующих событиях этапа конвейера OWIN: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. По умолчанию Омкс выполняется в последнем событии (PreHandlerExecute).By default, OMCs run at the last event (PreHandlerExecute). Именно поэтому наш первый пример кода выводит «Приксекутерекуессандлер».That's why our first example code displayed "PreExecuteRequestHandler".

  2. Можно использовать метод app.UseStageMarker, чтобы зарегистрировать ОМК для выполнения ранее, на любом этапе конвейера OWIN, указанном в перечислении PipelineStage.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. Конвейер OWIN и конвейер IIS упорядочены, поэтому вызовы app.UseStageMarker должны выполняться по порядку.The OWIN pipeline and the IIS pipeline is ordered, therefore calls to app.UseStageMarker must be in order. Обработчику событий нельзя присвоить событие, которое предшествует последнему событию, зарегистрированному в app.UseStageMarker.You cannot set the event handler to an event that precedes the last event registered with to app.UseStageMarker. Например, после вызова:For example, after calling:

    app.UseStageMarker(PipelineStage.Authorize);
    

    вызовы app.UseStageMarker, передающие Authenticate или PostAuthenticate, не будут учитываться и исключения не будут выдаваться.calls to app.UseStageMarker passing Authenticate or PostAuthenticate will not be honored, and no exception will be thrown. Омкс запускается на последнем этапе, по умолчанию PreHandlerExecute.OMCs run at the latest stage, which by default is PreHandlerExecute. Маркеры этапа используются для того, чтобы они выполнялись раньше.The stage markers are used to make them to run earlier. Если маркеры этапа заданы не по порядку, мы округляем до более раннего маркера.If you specify stage markers out of order, we round to the earlier marker. Иными словами, при добавлении маркера этапа будет указано "выполнять не позднее, чем на этапе X".In other words, adding a stage marker says "Run no later than stage X". ОМК запускается на более раннем маркере этапа, добавленном после них в конвейере OWIN.OMC's run at the earliest stage marker added after them in the OWIN pipeline.

  4. Самый ранний этап вызовов app.UseStageMarker WINS.The earliest stage of calls to app.UseStageMarker wins. Например, при переключении порядка вызовов app.UseStageMarker из нашего предыдущего примера: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);
    }
    

    В окне вывода отобразятся следующие данные: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
    

    Омкс все выполняется на этапе AuthenticateRequest, поскольку последняя ОМК, зарегистрированная в событии Authenticate, и событие Authenticate предшествуют всем остальным событиям.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.