上一篇咱們介紹了系統日誌與測試相關的內容並添加了相關的功能;本章咱們將介紹跨域與程序部署相關的內容html
一、什麼是跨域?前端
一個請求的URL由協議,域名,端口號組成,以百度的https://www.baidu.com爲例,協議爲https,域名由子域名www和主域名baidu組成,端口號若爲80會自動隱藏(也能夠配置爲其它端口,經過代理服務器將80端口請求轉發給實際的端口號)。而當請求的URL的協議,域名,端口號任意一個於當前頁面的URL不一樣即爲跨域python
二、什麼是同源策略?linux
瀏覽器存在一個同源策略,即爲了防範跨站腳本的攻擊,出現跨域請求時瀏覽器會限制自身不能執行其它網站的腳本(如JavaScript)。因此說當咱們把項目部署到Web服務器後,經過瀏覽器進行請求時就會出現同源策略問題;而像PostMan軟件因其是客戶端形式的,因此不存在此類問題nginx
三、跨域會致使什麼問題?sql
同源策略會限制如下行爲:數據庫
這裏咱們將簡單介紹針對跨域問題經常使用的幾種解決辦法,並就其中的Cors方法進行配置,若對其它方式感興趣,可參照老張的哲學的文章,⅖ 種方法實現完美跨域json
一、原理windows
上面有提到瀏覽器基於其同源策略會限制部分行爲,但對於Script標籤是沒有限制的,而JsonP就是基於這一點,它會在頁面種動態的插入Script標籤,其Src屬性對應的就是api接口的地址,前端會以Get方式將處理函數以回調的形式傳遞給後端,後端響應後會再以回調的方式傳遞給前端,最終頁面得以顯示後端
二、優缺點
JsonP出現時間較早,因此對舊版本瀏覽器支持性較好;但自身只支持Get請求,沒法確認請求是否成功
一、原理
CORS的全稱是Corss Origin Resource Sharing,即跨域資源共享,它容許將當前域下的資源被其它域的腳本請求訪問。其實現原理就是在響應的head中添加Access-Control-Allow-Origin,只要有該字段就支持跨域請求
二、優缺點
Cors支持全部Http方法,不用考慮接口規則,使用簡單;可是對一些舊版本的瀏覽器支持性欠佳
三、使用
其使用很是簡單,以咱們的項目爲例,在BlogSystem.Core項目的Startup類的ConfigureServices方法中進行以下配置
同時須要開啓使用中間件,以下:
一、原理
跨域問題是指在一個地址中發起另外一個地址的請求,而Nginx能夠利用其反向代理的功能,接受請求後直接請求該地址,相似打開了一個新的頁面,因此能夠避開跨域的問題
二、優缺點
配置簡單,能夠下降開發成本,方便配置負載均衡;靈活性差,每一個環境都須要進行不一樣的配置
在.NET Core中,有兩種部署模式,分別爲FDD(Framework-dependent)框架依賴發佈模式和SCD(Self-contained)自包含獨立發佈模式
如下內容均參考老張的哲學的文章最全的部署方案 & 最豐富的錯誤分析,有興趣的朋友能夠參考原文
須要注意的是上述兩類方法都須要藉助IIS或者是代理服務器進行服務的轉發,不然只能在本地進行訪問;
Linux平臺經常使用的部署方式即爲程序+代理服務器,可是當咱們配置完成後運行程序時,該運行命令會一直佔用操做窗口,因此咱們須要使用「守護進程」來解決這個問題,簡單來講就是將程序放到後臺運行,不影響咱們進行其餘操做
綜上,部署模式、部署方式及部署平臺有多種組合方式,接下來咱們挑選下述3種方法進行演示:
方案 | 依賴運行時/宿主機 | 依賴代理服務器 | 其它配置 |
---|---|---|---|
Windows程序(SCD)+Nginx | 否 | 是 | 無 |
Windows服務(FDD)+IIS | 是 | 否 | 設置爲服務 |
Linux程序(FDD)+Nginx | 是 | 是 | 守護進程 |
一、這裏咱們右擊BlogSystem.Core項目,選擇發佈,選擇文件夾後,點擊高級
二、爲了演示後面的發佈實例,這裏咱們分別選擇3種組合模式,①獨立+win-x64;②框架依賴+win-x64;③框架依賴+linux-x64
三、將發佈實例拷貝到單獨的文件夾種,這裏咱們使用SCD-Window驗證下程序可否直接運行,運行BlogSystem.Core.exe,報錯:
原來仍是老問題,BLL沒有添加到發佈文件中,咱們到項目的bin文件夾下將BLL和DAL的dll文件分別拷貝至3個文件夾,再次運行,出現404錯誤,通過確認發現,首頁對應的是Swagger文檔頁面,而在配置中間件時咱們有添加開發環境才配置swagger的邏輯,因此這裏咱們能夠根據我的需求決定是否添加。
這裏我爲了方便確認發佈是否成功,因此將其從判斷邏輯中取出了。從新生成發佈文件,拷貝BLL和DAL的dll文件,再次運行,仍是報錯。原來時Swagger的XML文件缺失,從bin文件夾下拷貝添加至發佈文件,運行後成功顯示頁面
四、有的朋友會說了,每次都要拷貝這兩個dll和這兩個xml文件,太麻煩了。其實也是有對應的解決辦法的,咱們可使用dotnet的CLI命令進行發佈,選擇引用的發佈文件夾爲bin文件夾,拷貝至發佈文件夾便可,有興趣的朋友能夠自行研究
這裏我用的是阿里雲服務器,Window系統版本是Window Server2012 R2,Linux系統版本是CentOS 8.0;在操做前記得確認拷貝的發佈文件可否在本地正常運行
一、解壓後雙擊exe文件網站能夠正常運行,以下:
二、這個時候咱們發現了一個問題,服務器上沒有數據庫,因此沒法確認功能是否正常,這裏咱們先下載安裝一個Microsoft SQL Server 2012 Express數據庫(建項目時沒有考慮到發佈後測試的問題,實際上像SQLite數據庫是很是符合這類場景的)
安裝完成後咱們新建一個BlogSystem的數據庫,經過Sql文件的形式將數據庫結構和數據導入至服務器數據庫,這時候又發現一個問題,因爲咱們鏈接數據庫的邏輯放置在model層的BlogSystemContext文件夾下,因此須要將鏈接中的DataSource更改成Express數據庫,從新發布後覆蓋舊的發佈文件(系統設計有缺陷,能夠將EF上下文文件放在應用程序層或單獨一層),再次運行,成功執行查詢,以下:
三、這個時候本地已經能夠進行正常的訪問了,可是外部網絡是沒法訪問調用接口的,這裏咱們藉助Nginx進行服務的轉發。下載Nginx後解壓對conf文件夾下的nginx.conf文件進行以下配置:
四、在nginx.exe文件所在目錄的文件路徑輸入cmd,鍵入nginx啓動服務訪問8081端口,成功顯示頁面(確保core程序正常運行)以下:
五、這個時候咱們使用其它電腦訪問接口,發現仍是沒法訪問,通過查詢是阿里雲服務器進行了相關的限制,在阿里雲控制檯配置安全組規則後便可正常訪問,以下:
六、配置完成後運行,成功訪問該網站且功能正常。這類方法不須要藉助Core的運行時環境,能夠說十分便捷
一、首先咱們將FDD發佈文件壓縮後拷貝至Window Server主機,因FDD的部署方法須要藉助.NET Core運行時環境,因此這裏咱們首先到官網https://dotnet.microsoft.com/download/dotnet-core/current/runtime下載安裝.NET Core運行時,這裏咱們選擇的是右邊這個,安裝完須要從新啓動
二、上一個方法中桌面顯示控制檯窗口顯然不是一個較佳的方案,因此這裏咱們將其註冊爲服務。官方提供了ASP.NET Core服務託管的方法,但使用較爲複雜,這裏咱們藉助一個名爲nssm的工具來達到一樣的目的。咱們下載nssm後,在其exe路徑運行cmd命令,執行nssm install,在彈出的窗口中進行以下配置:
三、咱們在系統服務中開啓BlogSytem.Core_Server,在控制面版中選擇安裝IIS服務,併發布對應的項目,安裝完成後,添加部署爲8082端口,將應用程序池修改成無託管,以下:
四、運行網站,成功顯示頁面,可是進行功能試用時發現報錯;通過確認是因爲IIS應用程序池的用戶驗證模式和sqlserver的驗證模式不一樣,解決辦法有三種①修改應用程序池高級設置中的進程模型中的標識②將鏈接數據庫字符串中的Integrated Security=True去除,並添加數據庫鏈接對應的帳號密碼③在數據庫的「安全性」>「登陸名」裏面,添加對應IIS程序池的名稱,並在這個用戶的「服務器角色」和「用戶映射」中給他對應的權限
後續嘗試方案一失敗,嘗試方案二成功,方案三因爲要安裝SSMS因此沒有嘗試,有遇到相同問題的朋友能夠本身試下
一、首先咱們使用MobaXterm工具登陸至Linux主機(選擇此工具是因爲其)同時支持文件傳送和命令行操做),這裏使用的Linux版本是CentOS 8.0;藉助MobaXterm工具在home文件夾下建立WebSite文件夾,並在其內部建立BlogSystem文件夾,將咱們準備好的FDD部署方式的發佈文件上傳至此文件夾後,使用命令sudo dnf install dotnet-sdk-3.1
安裝.net core sdk,以下圖
二、輸入cd /home/WebSite/BlogSystem
切換至項目文件夾後,使用dotnet BlogSystem.Core.dll
運行程序,成功執行,可是因爲咱們沒有數據庫,且未配置代理服務器,因此沒法驗證服務是否正常運行;因此這裏咱們先參照微軟doc快速入門:在 Red Hat 上安裝 SQL Server 並建立數據庫安裝Sql Server數據庫(阿里雲默認安裝了python3做爲解釋器因此無需重複安裝),安裝完成後咱們開放在阿里雲實例中開放1433端口,使用可視化工具導入表結構和數據
三、完成上述操做後咱們須要配置守護進程,將程序放在後臺運行。首先咱們在/etc/systemd/system下新建守護進程文件,文件名以.service結尾,這裏咱們新建名爲BlogSystem.service文件,使用MobaXterm自帶的編輯器打開文件後進行以下配置,注意後面的中文備註須要去除不然會報錯
[Unit] Description=BlogSystem #服務描述,隨便填就好 [Service] WorkingDirectory=/home/WebSite/BlogSystem/ #工做目錄,填你應用的絕對路徑 ExecStart=/usr/bin/dotnet /home/WebSite/BlogSystem/BlogSystem.Core.dll #啓動:前半截是你dotnet的位置(通常都在這個位置),後半部分是你程序入口的dll,中間用空格隔開 Restart=always RestartSec=25 #若是服務出現問題會在25秒後重啓,數值可本身設置 SyslogIdentifier=BlogSystem #設置日誌標識,此行能夠沒有 User=root #配置服務用戶,越高越好 Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target
咱們使用cd /etc/systemd/system/
切換至BlogSystem.service對應的目錄,使用systemctl enable BlogSystem.service
設置爲開機運行後,再使用systemctl start BlogSystem.service
啓動服務,另外可使用systemctl status BlogSystem
確認服務狀態
四、接下來咱們安裝代理Nginx代理默認的5000端口,使用sudo yum install nginx
安裝nginx後,咱們到\etc\nginx文件夾下打開nginx.conf文件進行以下配置:
配置完成咱們進入\etc\nginx文件夾下,使用systemctl enable nginx
將nginx設置爲開機啓動,並使用systemctl start nginx
啓用服務,一樣可使用systemctl status nginx
確認其狀態。確認無誤後在阿里雲中開放8081端口,外網可正常訪問,但功能試用時報錯,原來是數據庫鏈接錯誤,從新設置後便可正常訪問
本人知識點有限,若文中有錯誤的地方請及時指正,方便你們更好的學習和交流。
本文部份內容參考了網絡上的視頻內容和文章,僅爲學習和交流,地址以下:
老張的哲學,系列1、ASP.NET Core 學習視頻教程
solenovex,ASP.NET Core 3.x 入門視頻