.Net Core實踐4 web 反向代理
目標
將控制臺程序改成web程序,通過IIS反向代理,處理請求
環境
win10 / .net core 2.1 / centos7
變成web程序
1.在新建的asp.net core控制臺程序中添加
Microsoft.AspNetCore.Server.IISIntegration // 這個用於IIS反向代理
Microsoft.AspNetCore.Server.Kestrel // 這個是asp.net core的服務器,由於跨平臺,所以不能再使用IIS了,以前的ASP.NET,可以利用IIS提供的便利
// 這個用於添加"中間件",是處理請求用. asp.net core和asp.net完全不同了,asp.net管道有十幾個事件,註冊這些事件就能在請求的不同階段作出處理.
// 但這個方案並不是最佳的,因為這些事件相當於是一種具體實現,它肯定不能很好的貼合各種形式的要求.
// asp.net core通過註冊中間件的方式,相當於由自己定制處理事件,自定義個數和順序.這個明顯是一種更上層的抽象.更加的靈活
Microsoft.AspNetCore.Hosting
2.在Main方法裏初始化kestrel服務器
// 程序運行後,開啟一個web程序,
new WebHostBuilder()
// 使用這個服務器來運行這個web程序.kestrel是默認的asp.net core服務器.
.UseKestrel()
// 為IIS反向代理提供支持 反向代理是指服務器RP接到請求後,將請求通過HTTP請求轉發給和它在一個局域網內的其它服務器,RP自己並不處理請求,只是轉發
.UseIISIntegration()
// 這個是註冊中間件,也就是加處理程序的地方, Startup類裏必要有這個Configure方法
.UseStartup<Startup>()
// 建立並運行這個web服務
.Build()
.Run();
// 約定叫這個Startup名字,當然也可是其它的.主要是這個類裏要有Configure方法,它註冊了所謂中間件
class Startup
{
public void Configure(IApplicationBuilder app)
{
// 這個類裏只註冊了一個中間件,就是處理靜態文件的中間件
// 要使用這個方法,需要引用 Microsoft.AspNetCore.StaticFiles 這個包
app.UseStaticFiles();
// 這個處理方法,接收到非靜態文件請求,返回這句話
app.Run(context => context.Response.WriteAsync("Hello World 這是處理程序返回的內容"));
}
}
3.到此,運行這個程序,出現控制臺窗口,顯示web服務器運行了
默認監聽的地址是: Http://localhost:5000 在瀏覽器中打開,成功的話,顯示 Hello World
默認情況下,web應用程序目錄是當前程序所在目錄,web靜態文件目錄是當前程序目錄下的wwwroot目錄.
可以在程序目錄下,新建一個wwwroot目錄,放入一個靜態html文件,瀏覽器中就可查看到.
IIS 反向代理
上面的測試都是直接訪問kestrel服務器,然而在WINDOWS上接收請求的最佳選擇仍然是IIS服務器.asp.net core教程上,也是要求將kestrel放在IIS之後處理請求,而由IIS接收請求,以保護服務器
需要做一些配置後,可以讓IIS反向代理ASP.NET CORE程序
一.下載asp.net core的IIS支持組件 dotnet-hosting-2.1.5-win.exe 下載地址 https://www.microsoft.com/net/download 在頁面中選擇Download .Net Core Runtime這個,下載之後安裝,IIS模塊會多一個
二.新建一個站點,目錄指向asp.net core程序的運行目錄.將站點的應用程序池設為無托管應用程序
三.站點的模塊和映射最小需要兩個模塊和兩個映射 靜態文件,asp.net core映射, asp.netcore模塊和匿名驗證模塊
四.web.config
asp.net core並不需要這個文件,由於掛IIS托管反向.所以這個文件用於IIS,它也放在asp.net core程序運行目錄下.其中最重要的配置節為
<aspNetCore processPath="dotnet"
arguments="Web.dll"
stdoutLogEnabled="true"
stdoutLogFile="./">
</aspNetCore>
processPath 表示使用dotnet命令,運行這個web程序. 只要架設好IIS後,不需要手動啟動asp.net core程序,通過這個命令,在iis啟動網站後,asp.net core程序就會啟動
arguments 表示asp.net web應用程序的那個可執行文件
後面兩個可以記錄日誌,在調試時,日誌會記錄出錯的地方.比如asp.net core程序沒有運行起來.出錯日誌會記錄在程序運行目錄下.
五.遇到的錯誤
剛開始使用反向代理IIS 轉到 UseKestrel 後.發現無法運行出現502.3錯誤,
查看日誌發現可能是權限不足,導致程序無法執行某些庫.
研究後發現,將用到的軟件包目錄添加上相應權限即可.users組,這個用戶添加到目錄上,讀取和執行權限.
在win10系統上,aspnetcore的軟件包位置默認有兩處
一處在於
C:\Users\當前用戶目錄下\.nuget 這個文件夾下,這個是Nuget包的總目錄,必須有執行權限
二處在於
C:\Program Files\dotnet 這個目錄下,這個是dotnet命令的目錄,另外,nuget包的依賴包,也在這個目錄下,C:\Program Files\dotnet\sdk\NuGetFallbackFolder
linux下運行
上面兩個路徑下裝了程序運行需要的所有庫,如果運行時報缺少庫,基本上就是這兩個地方的問題
NuGetFallbackFolder這個目錄比較重要,如果發現nuget包運行失敗缺少依賴項,則應檢查這個目錄下就沒有這個包的依賴項存在.一般來講,
通過VS的nuget包管理器下載的包,是沒有這個問題的.
當程序部署到其它機器如linux上時,就會發生這個問題.此時,只要將這兩個目錄的包,對應的復制到目標機器上就可以了
.Net Core實踐4 web 反向代理