HttpPlatformHandler 是一個支援 IIS 8 與 IIS 8.5 的原生模組 (native module),主要使用於 Microsoft Azure Websites 網站服務中,用途是讓 Java 或其他第三方程序可以輕鬆整合到 IIS 之中,讓各種 Web 框架都能直接掛載到 IIS 之上。而近期發佈的 ASP.NET 5 Beta8 版本也正式宣告改採 HttpPlatformHandler 模組搭配 Kestrel HTTP Server 執行 ASP.NET 5 應用程式,想要了解其內部運作結構,必須得了解一下。

基本上 HttpPlatformHandler 主要做兩件事:

  1. Process Management of http listeners 任意第三方程序原本需要監聽 (listen) 可接受 HTTP 要求的通訊埠 (Port),都改交由 IIS 來接受要求。 例如 Tomcat, Jetty, Node.exe, Ruby 等等,當然 ASP.NET 5 的 Kestrel 也是屬於這個類型的程序。
  2. Proxy requests to the process that it manages 將那些交由 IIS 代理監聽的 HTTP 要求轉發到被管理的第三方程序。

簡單來說,原本你可能可以直接用 Node.js 或 Ruby 來執行網站,Node.js 或 Ruby 原本就能監聽 (listen) 通訊埠 (Port),但如果 Node.js 或 Ruby 掛掉的話,網站也就死了。不過若想透過 IIS + HttpPlatformHandler 來管理者些程序,優點就是所有接聽 HTTP 要求的任務都改由 IIS 負責,並且由 IIS 啟動第三方程序 ( 例如 Node.js 或 Ruby ),然後由 IIS 將這些 HTTP 要求轉發到第三方程序中。如果第三方程序掛掉了,IIS 就會視同沒有執行這個程序,並且自動重新啟動第三方程序。

HttpPlatformHandler 模組的設定主要設定在 web.config 或 applicationHost.config 設定檔裡,主要設定在 <system.webServer> 區段下,詳細的設定方法可參考 HttpPlatformHandler Configuration Reference 文件。

我們可以來看看幾個的設定範例:

1. ASP.NET 5

<configuration>
<system.webServer>
<handlers>
<add name="httpplatformhandler"
path="*"
verb="*"
modules="httpPlatformHandler"
resourceType="Unspecified" />
</handlers>
<httpPlatform
processPath="..\approot\web.cmd"
arguments=""
stdoutLogEnabled="false"
stdoutLogFile="..\logs\stdout.log"
startupTimeLimit="3600">
</httpPlatform>
</system.webServer>
</configuration>

2. Tomcat (Java)

<configuration>
<system.webServer>
<handlers>
<add name="httpplatformhandler"
path="*"
verb="*"
modules="httpPlatformHandler"
resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="c:\dev\javasites\bin\apache-tomcat-8.0.15\bin\startup.bat"
arguments=""
stdoutLogEnabled="true"
stdoutLogFile="\\?c:\dev\javasites\log.txt">
<environmentVariables>
<environmentVariable name="JRE_HOME" value="%programfiles%\java\jdk1.8.0_25" />
<environmentVariable name="CATALINA_OPTS" value="-Dport.http=%HTTP_PLATFORM_PORT% -Dsomeotherconfig=value"/>
<environmentVariable name="CATALINA_HOME" value="c:\dev\javasites\bin\apache-tomcat-8.0.15" />
</environmentVariables>
</httpPlatform>
</system.webServer>
</configuration>

3. Jetty (Java)

<configuration>
<system.webServer>
<handlers>
<add name="httpplatformhandler"
path="*"
verb="*"
modules="httpPlatformHandler"
resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="c:\Program Files\Java\jdk1.8.0_25\bin\java.exe"
arguments="-Djava.net.preferIPv4Stack=true -Djetty.port=%HTTP_PLATFORM_PORT% -Djetty.base="c:\dev\javasites\bin\jetty-distribution-9.2.6.v20141205" -jar "c:\dev\javasites\bin\jetty-distribution-9.2.6.v20141205\start.jar""
startupTimeLimit="20"
startupRetryCount="20"
stdoutLogEnabled="true">
</httpPlatform>
</system.webServer>
</configuration>

從以上幾個設定範例可以看出,其實 HttpPlatformHandler 的架構非常單純,就是由 IIS 幫你管理第三方程序,啟動第三方程序時,可直接設定啟動的程序 (processPath)、參數 (arguments) 與一些啟動參數,例如啟動時間限制 (startupTimeLimit)、啟動重試次數上限 (startupRetryCount)、是否輸出記錄到 stdout 管線中 (stdoutLogEnabled)、是否將輸出寫入到檔案中 (stdoutLogFile)、…等等,當然,必要的時候還可以設定額外的 環境變數 (environmentVariables) 給第三方程序使用。

關於 ASP.NET 5 Beta8 的重大變更

在 ASP.NET 5 發展的早期,有個 Helios 專案負責讓全新的 ASP.NET 5 框架能夠執行在 IIS 之上,這個 Helios 專案 (包含在 Microsoft.AspNet.Server.IIS 套件中) 主要用途是將 DNX 與 CLR 掛載到 System.Web hosting model 之中,在網站啟動之後動態抽換掉正在執行的 Runtime,改由 DNX 與 CoreCLR 來執行程式。這也意味著在 System.Web hosting model 與 DNX hosting model 有許多邏輯是重疊的,而日後在維護 ASP.NET 5 框架時勢必引發更複雜的實作,也很難維護兩個 hosting model 之間的一致性,因此微軟決定在 ASP.NET 5 Beta8 開始將 Helios 退役。

Helios 退役之後,便改用效能更好的 Kestrel 來執行 ASP.NET 5 應用程式,這個 Kestrel HTTP Server 基於 跨平台 的 libuv 函式庫,這個 libuv 函式庫採用非同步 I/O 架構,常用於 Node.js 之中,執行效能極佳,你可以看看 ASP.NET 5 Benchmarks 頁面最後的 Plain Text with HTTP Pipelining 測試數據,ASP.NET 5 on Kestrel 的壓力測試竟然可以測出每秒 443,528 個要求,這實在是個非常驚人的數字!

當然,你要知道 Kestrel 本身就是一台 HTTP 伺服器,不需要 IIS 也能運作,並且可在 Windows, Linux, OS X 上面跨平台執行。

只是在 Windows 平台上,你可以利用 IIS 搭配 HttpPlatformHandler 來執行,讓 IIS 幫你管理 Kestrel 程序,安全性與穩定度都將會大幅提高,不過唯一的缺點就是會犧牲掉一些效能,畢竟經由 IIS 代理所有的 HTTP 要求,這當中多少會有所損耗,但我認為這點損耗可以靠 橫向擴展 (Scale Out) 來解決,所以這是可以接受的權衡措施 (Trade-off)。

另外,使用 IIS / HttpPlatformHandler  搭配 Kestrel 來執行 ASP.NET 5 還有許多優點:

  1. 你的 IIS 應用程式集區不需要載入任何 Managed 程式碼,甚至於完全不用設定載入 CLR 就可以執行網站。( 因為所有 HTTP 要求都被轉送到 Kestrel 處裡 )
  2. 因為應用程式集區不需要載入 CLR,因此也不需要事先安裝 ASP.NET 相關元件。如下圖示,這就不一定要安裝了:
  3. 你原本的 ASP.NET 4.x 模組依然可以跑在 IIS 上面,就算你有啟用 HttpPlatformHandler 也完全不影響原本 IIS 模組的執行,因為 ASP.NET 4 與 ASP.NET 5 隸屬於完全不同的執行程序。
  4. 由於你可以在 web.config 中透過 HttpPlatformHandler 設定 環境變數 ,因此你可以透過 web.config 即可控制 ASP.NET 5 的 Environment 屬性值,只要透過設定檔就可以控制 ASP.NET 5 的執行過程。( 例如切換 Staging 或 Production 等模式,這些模式都可以自由設定,詳細說明可參考 ASP.NET 5 的 Working with Multiple Environments 文件 )
  5. 在多台伺服器之間使用一致的標準,處裡第三方程序的啟動錯誤。
  6. 一致的程式碼與執行過程:
    • 無論你透過 self-hosted 或 IIS 執行 .NET Framework (full CLR) 時,都支援 app.config 設定檔讀取。 (ASP.NET 5 已經不再需要讀取 web.config 設定檔)
    • 設定與使用服務元件時更加一致 ( Startup.cs )
    • 一致的啟動過程 ( 不再有詭異的 bin\AspNetLoader.dll 檔案 )

最後,你若從 Visual Studio 2015 建立 ASP.NET 5 Beta8 專案,可以看到在 wwwroot\web.config 這個檔案

該檔案定義了 <httpPlatform> 設定,並在 processPath 與 arguments 放入了變數,這個變數會交由 Visual Studio 2015 進行管理,當在發佈網站時,會透過 dnu publish 命令,搭配 --iis-command 選項進行變更。

更詳盡的討論可以參考 Change to IIS hosting model · Issue #69 · aspnet/Announcements 網頁說明。

備註:未來所有 ASP.NET 5 的重大變更都會公告在 Issues · aspnet/Announcements 這裡。

介紹 IIS 8 全新的 HttpPlatformHandler 模組與 ASP.NET 5 Beta8 重大變更的更多相关文章

  1. Browser 與 Server 持續同步的作法介紹 (Polling, Comet, Long Polling, WebSocket)长连接

    對 Comet 的懵懂 記得兩年多前,第一次看到 Gmail 中的 GTalk 覺得很好奇:「咦?線上聊天且是 Google 的熱門系統,只用傳統的 AJAX 應該會操爆伺服器吧?」很幸運的,當時前公 ...

  2. Linux Kernel 排程機制介紹

    http://loda.hala01.com/2011/12/linux-kernel-%E6%8E%92%E7%A8%8B%E6%A9%9F%E5%88%B6%E4%BB%8B%E7%B4%B9/ ...

  3. PCB成型製程介紹

    PCB成型製程在電子構裝中所扮演的角色 下圖是電腦主機的內部組成 我們將以插在主機板上的一片 USB擴充卡來說明PCB成型製 程在電子構裝中所扮演的角色 PCB成型製程的子製程 USB擴充卡要插入主機 ...

  4. Visual Studio 跨平台開發實戰(4) - Xamarin Android 基本控制項介紹 (转帖)

    前言 不同於iOS, Xamarin 在Visual Studio中針對Android, 可以直接設計使用者介面. 在本篇教學文章中, 筆者會針對Android的專案目錄結構以及基本控制項進行介紹, ...

  5. Visual Studio 跨平台開發實戰(2) - Xamarin.iOS 基本控制項介紹 (转帖)

    前言 在上一篇文章中, 我們介紹了Xamarin 以及簡單的HelloWorld範例, 這次我們針對iOS的專案目錄架構以及基本控制項進行說明. 包含UIButton,, UISlider, UISw ...

  6. 用Razor語法寫範本-RazorEngine組件介紹【转——非常好,可以用它来代替NVelocity】

    RazorEngine 官網網址:http://razorengine.codeplex.com 在找到RazorEngine之前曾經想過其他的方案,如T4與V8 Engine載jquery.temp ...

  7. COB(Chip On Board)的製程簡單介紹

    前面提及 COB 的生產與 IC 的封裝製程幾乎是一致的,除了把 leadframe 改成了 PCB,把封膠由 molding 改成 dispensing,少了 triming & marki ...

  8. QR Code於台灣各行業的行銷應用案例介紹

    當走在東京的大街小巷時,在五花八門的廣告看板.雜誌.護照簽證.海關.宣傳品.廣告.旅遊和導覽手冊.產品包裝.甚至在餐廳菜單上,皆可看到上面有一組黑色神秘二維條碼圖案:QR Code,當看到有興趣的商品 ...

  9. 容器加載Web工程的Web.xml文件介紹

    转 容器加載Web工程的Web.xml文件介紹 [-] 这篇文章主要是综合网上关于webxml的一些介绍希望对大家有所帮助也欢迎大家一起讨论 ---题记 一            Webxml详解 一 ...

随机推荐

  1. HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...

  2. DB2和Oracle中Date比较

  3. GLASNICI 解题报告

    GLASNICI 解题报告 题目描述 有N个人在一直线上,第i个人的位置为Di,满足Di≤Di+1.最初只有第1个人(在最左边)知道消息. 在任意时刻,每个人可以以每秒1单位的速度向左或向右移动,或者 ...

  4. umask相关内容

    umask权限过滤符新创建的文件的权限为666,即- rw- rw- rw-新创建的目录的权限为777,即d rwxrwxrwx如umask值为0022,后三位022,即 --- -w- -w-上述默 ...

  5. 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录

    在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...

  6. Web开发——服务器端应用技术简单比较

    在开发动态网站时,离不开服务器端技术,服务器端技术主要有CGI.ASP.PHP.ASP.NET和JSP. 1.CGI CGI(Common Gateway Interface 通用网关接口)是最早用来 ...

  7. CodeForces 785D Anton and School - 2

    枚举,容斥原理,范德蒙恒等式. 先预处理每个位置之前有多少个左括号,记为$L[i]$. 每个位置之后有多少个右括号,记为$R[i]$. 然后枚举子序列中第一个右括号的位置,计算这个括号的第一个右括号的 ...

  8. 洛谷P3435 [POI2006]OKR-Period of Words [KMP]

    洛谷传送门,BZOJ传送门 OKR-Period of Words Description 一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, ...

  9. SpringMVC框架 注解 (转)

    原文地址:http://www.cnblogs.com/yjq520/p/6734422.html 1.@Controller @Controller 用于标记在一个类上,使用它标记的类就是一个Spr ...

  10. linux——(8)数据流重定向、管道命令

    概念一:数据流重定向 数据流分输入流和输出流,还有一个标准错误流,负责管理出错信息,比如一般的命令的输出会输出到屏幕上,我们可以用重定向让他输入到某个文件内. 相关操作: 1,标准输入(stdin): ...