1. 程式人生 > >.Net Core實踐4 web 反向代理

.Net Core實踐4 web 反向代理

files 啟動 用戶目錄 ces user async microsoft config 通過

目標

將控制臺程序改成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 反向代理