Owin Middleware如何在IIS集成管道中執行

来源:http://www.cnblogs.com/LittleFeiHu/archive/2017/08/13/7352434.html
-Advertisement-
Play Games

Owin Middleware Components(OMCs) 通過安裝Install-Package Microsoft.Owin.Host.SystemWeb 可以讓OMCs在IIS集成管道下工作 在IIS集成管道里,這個request pipeline 包含HttpModules關聯到一組預 ...


Owin Middleware Components(OMCs)

通過安裝Install-Package Microsoft.Owin.Host.SystemWeb

可以讓OMCs在IIS集成管道下工作

在IIS集成管道里,這個request pipeline 包含HttpModules關聯到一組預定義的管道事件,例如

BeginRequest, AuthenticateRequest, AuthorizeRequest,等

如果我們將OMC和HttpModule進行比較,OMC也和HttpModule一樣,必須要被註冊到一個恰當的預定義的管道事件里,比如下麵的這個Httpmodule,

當一個請求來到AuthenticateRequest階段時,MyModule會被調用

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.
    }
}

 為了使OMC取參與和HttpModule相同的基於事件的執行順序,Katana運行時代碼掃描Startup配置,並且把每個OMC關聯到某個集成管道事件里,

比如下麵的配置:

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);
        }
    }
}

 輸出如下:

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

 可以看到Katana運行時預設映射每個OMC到IIS管道事件PreRequestHandlerExecute

你可以根據需要調整這個OMC和管道事件的這種預設關係,具體使用一個擴展方法IAppBuilder UseStageMarker(),

像下麵這樣:

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);
}

 輸出如下:

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

 

https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Azure 12 月新發佈:導入/導出服務,虛擬機和雲服務的 Av2,虛擬網路對等互連現已正式發佈以及流分析的更新 ...
  • 共用訪問簽名是一種字元串,包含可附加到 URI 的安全令牌,可以讓我們委派對象的訪問許可權,並指定訪問的許可權和日期/時間範圍等限制。例如我們可以授予對 Blob、容器、隊列、文件和表的訪問許可權。很多服務在做驗證時都會用到 SAS,例如 Azure Service Bus、Azure IoT Hub 等... ...
  • 上篇講了 "《asp.net core在linux上的環境部署》" 。今天我們將做幾個小玩意實戰一下。用到的技術和工具有mysql、websocket、AngleSharp(爬蟲html解析)、nginx多站點部署。 NO1 留言板(mysql的使用) 演示:http://haojima.net 這 ...
  • 推薦網站:http://blog.csdn.net/zhuyu19911016520/article/category/6318590 ...
  • 目的: 擴展 C# WinForm 自帶的表格控制項,使其可以自動判斷數據的上下界限值,並標識溢出。 這裡使用的方法是:擴展 表格的列 對象:DataGridViewColumn。 1.創建類:DecimalCheckCell 2.創建類:DecimalCheckColumn 3.現在就可以使用了,在 ...
  • C#筆記25:比較和排序(IComparable和IComparer以及它們的泛型實現) 本文摘要: 1:比較和排序的概念; 2:IComparable和IComparer; 3:IComparable和IComparer的泛型實現IComparable<T>和IComparer<T>; 1:比較和 ...
  • //1、 // 裝箱和拆箱是一個抽象的概念 //2、 // 裝箱是將值類型轉換為引用類型 ;拆箱是將引用類型轉換為值類型 // 利用裝箱和拆箱功能,可通過允許值類型的任何值與Object 類型的值相互轉換,將//值類型與引用類型鏈接起來 //例如: int val = 100; object obj... ...
  • //使用Sort方法,可以對集合中的元素進行排序。Sort有三種重載方法,聲明代碼如下所//示。 public void Sort(); //使用集合元素的比較方式進行排序 public void Sort(IComparer comparer); //使用自定義比較器進行排序 public voi... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...