緣起
哈嘍大家好!今天是周一了,這幾天趁着午休的時間又讀了一本書《偷影子的人》,可以看看🙃。
本篇文章會一直更新,內容十分豐富,包含了NetCore+vue 的各種部署方案,以及遇到的主要錯誤分析,目的就是為了讓初學者可以有章可循。
本文匹配視頻:
https://www.bilibili.com/video/av58096866?p=9
https://www.bilibili.com/video/av58096866?p=10
一、部署
各種下載地址:
Runtime(winth hosting) + SDK: https://dotnet.microsoft.com/download
友1、WIN_獨立部署
感謝群里(白雲)小伙伴,博主 @小淋科技 提出的方案(需要 netcore2.1+ ),我竟然忽略了,該打該打,官檔都讀不仔細,果然三人行必有我師!
微軟官方文檔 ——《獨立部署 (SCD)》,使用這個方法很簡單,只需要部署的時候,選擇指定的平台,就可以不用安裝其他,比如運行時、托管、SDK等,不過這樣的話,可能下文的命令行操作不適用,不過還是很好很簡單的方案,歡迎嘗試。
1、WIN_IIS 部署,前后端不同站點
為了能有一個全新的環境,我還特地新買一台服務,要做好部署的准備,就必須要先進行初始化操作,也就是先准備好我們用到的原材料:
在服務器開啟 IIS 就不多說了,相信每一個 Dotnet 開發者百分比必須要會的,其他的操作流程請看下邊的步驟,具體的看動圖:
先給自己的兩個站點想好端口,比如我想的:core(1001端口)、Vue(1002端口)
// NetCore 部分 0、編譯項目,保證代碼沒問題,並配置 CORS 跨域服務;//下邊動圖中沒有配置CORS,大家自己要注意 ①、發布項目;//請注意我的 publish 路徑是 bin/Debug/netcore2.2,因為這樣肯定不會漏掉文件!!! ②、拷貝到服務器指定文件夾; ③、IIS 添加站點;// 端口 1001 ④、修改應用程序池為“無托管”;//這也是為啥要安裝 windows hosting 的原因 ⑤、安裝 windows hosting(服務托管);//這是一個捆包,已經包含 Runtime(下載地址見下文 錯誤碼 500.19 的解決方案中) ⑥、檢查是否有指定的 Runtime(運行時); ⑦、重啟項目,查看是否正常;http://localhost:1001/
// Vue 部分 ①、Build 項目; ②、拷貝到服務器指定文件夾; ③、IIS 添加站點;// 端口 1002 ④、運行項目,查看是否正常;http://localhost:1002/
動圖1():
修改好 hash 模式后,就成功了,注意要在 Core 項目中配置 CORS 跨域:
c.AddPolicy("LimitRequests", policy => { // 支持多個域名端口,注意端口號后不要帶/斜桿:比如localhost:8000/,是錯的 // 注意,http://127.0.0.1:1818 和 http://localhost:1818 是不一樣的,盡量寫兩個 policy .WithOrigins("http://127.0.0.1:1002", "http://localhost:1002") .AllowAnyHeader() .AllowAnyMethod(); });
最終結果如下:
2、WIN_IIS 部署,前后端一個站點
從上邊的過程中,可以看出來還是比較簡單的,一氣呵成,行雲流水,不過可能自己操作的時候會出現這樣那樣的問題,畢竟我也是給很多小伙伴都部署過,沒有上百,也有五十次了,如果你有錯誤,請看我文章下邊第二章的 常見錯誤 ,找到你遇到的錯誤。
上邊的操作中,我們是把兩個項目部署到了 IIS 中的不同站點,當然,我們也可以部署到一個站點,這樣的話,就是一個域名了,但是絲毫沒有影響我們分開開發,我們前后端攻城獅還是和以前一樣的開發,只是將發布的文件上傳到指定服務器文件夾中就行了。
操作步驟和上邊的其實是幾乎一樣的,只不過我們不需要配置 CORS 跨域了,因為是同一個站點,且是只需要一個端口號,我們定為 1003端口
// NetCore 部分,和上邊的幾乎一樣,只不過不用進行 CORS 跨域設置 ①、發布項目; ②、拷貝到服務器指定文件夾; ③、IIS 添加站點;// 端口 1003 ④、修改應用程序池為“無托管”;//這也是為啥要安裝 windows hosting 的原因 ⑤、安裝 windows hosting(服務托管);//這是一個捆包,已經包含 Runtime(下載地址見下文 錯誤碼 500.19 的解決方案中) ⑥、檢查是否有指定的 Runtime(運行時); ⑦、重啟項目,查看是否正常;http://localhost:1003/ // Vue 部分 ①、修改根路徑,並且 Build 項目;// 還要修改接口api的路徑,剩下的自己處理吧,不要項目后期用這個方法,路徑修改麻煩 ②、拷貝到服務器指定文件夾;//可以和 core 項目放到一起 ③、修改 Core 的 IIS 站點,在它的站點內,嵌套一個vue站點;// 取名為 Vue ④、運行項目,查看是否正常;http://localhost:1003/vue/
動圖2:
3、WIN_Git_Nginx_Kestrel 部署
上邊的 IIS 部署咱們說完了,大家發現,存在一些問題:
1、過分的依賴 IIS,並沒有完完全全的達到跨平台的目的;
2、操作步驟偏多,還需要拷貝文件,並且一個都不能少;
3、因為 IIS 會存在占資源的問題,每次如果我們更新 Blog.Core.dll 文件,都需要關閉站點,然后更新,再啟動;
那接下來咱們就說說如何使用 Nginx+Kestrel 來簡單的解決這些問題,步驟如下:
這里需要安裝 Nginx (http://nginx.org/en/download.html)、Git(https://git-scm.com/downloads)、SDK(http://go.microsoft.com/fwlink/?LinkID=287120),過程省略,大家自行安裝,這里我們把端口定為,NetCore(1004端口)、Vue(1005端口)
// NetCore 部分 ①、執行 Blog.Core.Build.bat 文件;// 主要是 git pull ,dotnet build 和 dotnet run ②、Nginx 代理服務,將 8081 端口,代理到 1004;//具體的代碼在下邊
③、查看是否正常;// http://localhost:1004/ // Vue 部分 ①、執行 BS 命令;// cnpm run BS,這里是我自己的命令,主要是git pull 和 build ②、Nginx 代理 Vue 服務,並配置跨域,代理到1005;//具體的代碼在下邊 ③、查看是否正常;// http://localhost:1005/
大家可以看看,或者直接感受一下,這種部署方案,和 IIS 的方案,哪一個更好一些?三步走,也是很簡單,而也很直觀的。
// 紅色是 NetCore 的 Nginx 相關配置;
// 綠色的是 Vue 的 Nginx 的相關配置;
#user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; #keepalive_timeout 0; keepalive_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; # dotnet core upstream dotnetblogserver1 { server 127.0.0.1:8081; } server { listen 1004; server_name localhost; location /{ proxy_pass http://dotnetblogserver1; index index.html index.htm; } location = /50x.html { root html; } } # vue server { listen 1005; server_name localhost; location / {
try_files $uri $uri/ /index.html; root nuxt\Blog.Admin\dist; index index.html index.htm; } location /api { rewrite ^.+apb/?(.*)$ /$1 break; include uwsgi_params; proxy_pass http://localhost:1004; #// 這是 netcore 端口 } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
}
從上邊的部署中,我們可以看到,過程中我們幾乎都沒有進行什么配置,或者說都是一次性的配置,比如 Git 安裝,比如 Nginx 的學習,只要我們配置了一次,以后多個項目就可以很快的操作了,比 IIS 每一個都要 Publish 並且各種配置來的快些。
不僅如此,我們也換掉了 IIS ,使用了 netcore 自帶的 Kestrel 應用服務器,並且不會出現任何不同步的問題,只要你本地調試好代碼,並 push 到 git 上!
動圖3:
4、WIN 部署到 Windows 服務
微軟有提供 如何在windows服務托管asp.net core ,不過步驟比較麻煩,還需要改源碼,網上找到一種方法 使用NSSM把.Net Core部署至windows服務
簡單說一下步驟
1. 下載nssm:http://www.nssm.cc/download
2. 運行cmd,定位到nssm.exe文件路徑,運行nssm install
3. 在彈出的窗口配置:
Path:dotnet所在的目錄,一般默認是在C:\Program Files\dotnet\dotnet.exe;
Startup directory:程序所在的目錄,就是最后程序dll所在的目錄;
Arguments:程序dll的名稱,一般是項目名加上.dll;
Service name:在此寫上服務的名稱即可。
最后點擊install service 完成windows服務安裝。
在windows服務找到對應服務名,啟動,然后根據launchSettings.json配置的端口訪問,即可調取接口。
4. 如果使用Nginx代理的話,注意端口是5000,不是8081
感謝博友 @小雪轉中雪 提醒
5、Linux_Ubuntu_Nginx 部署
1、安裝.NET Core
首先需要安裝.NET Core Runtime: https://www.microsoft.com/net/download
點擊之后,根據您的Linux發行版不同,選擇相應的操作步驟:
最后執行dotnet 驗證安裝是否成功:
2、安裝Nginx
另外還需要安裝Nginx,
sudo apt-get install nginx
安裝好后,直接訪問你的 IP 地址,如果看到如下效果說明安裝成功:
修改 nginx.conf 配置代理:
upstream dotnetblogserver1 { server 127.0.0.1:5018; } server { listen 4773; server_name core.idotnet5.com; location /{ proxy_pass http://dotnetblogserver1; index index.html index.htm; } location = /50x.html { root html; } }
修改后,重啟:
3、在服務器構建源碼並發布
然后就是發布程序了,發布有兩種辦法:
- 在開發機上執行 dotnet publish 然后把發布的文件遠程到服務器上
- 直接在服務器上使用源碼構建並發布,我一般是這樣做的。
如果直接在服務器上構建發布,所以需要安裝.NET Core SDK:https://www.microsoft.com/net/learn/get-started-with-dotnet-tutorial
然后就可以使用發布命令了:dotnet publish --configuration Release。
發布好的文件在 bin/Release/netcoreapp*.*/publish 下面。
再把publish下的所有文件復制到我的目標文件夾即可:
在我的目標目錄下,有這些文件:
如果執行 dotnet test.dll,這個程序就會在localhost:5000運行:
4、配置Nginx
然后我們再回來配置Nginx,進入 /etc/nginx/sites-available ,里面有一個Default文件,把它改個名,然后我們再建立一個新的Default文件:
保存后執行 sudo nginx -t 檢驗這個配置文件。
然后再執行 nginx -s reload 來重啟nginx。
隨后需要再把發布后的程序運行一下:dotnet test.dll:
在我使用網址訪問80端口的時候,會自動跳轉到 https//localhost:5001端口,導致連接失敗:
可以在開發的時候,就直接去掉項目中使用 https 地址就行,在 launchSettions.json 文件中:
或者禁用 https 中間件:
打開瀏覽器訪問試試:http://yourdomian.com/swagger/index.html
5、守護進程
在/etc/systemd/system 下新建文件(推薦使用winscp),文件名以.service結尾,配置內容為(注意:中文注釋需要刪掉,否則部分 Linux 服務器會報錯):
[Unit] Description=blogcore #服務描述,隨便填就好 [Service] WorkingDirectory=/website/blogcore #工作目錄,填你應用的絕對路徑 ExecStart=/usr/bin/dotnet /website/blogcote/CZKJ.CMS.Web.dll #啟動:前半截是你dotnet的位置(一般都在這個位置),后半部分是你程序入口的dll,中間用空格隔開 Restart=always RestartSec=25 #如果服務出現問題會在25秒后重啟,數值可自己設置 SyslogIdentifier=blogcore #設置日志標識,此行可以沒有 User=root #配置服務用戶,越高越好 Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target
寫完配置文件后保存,輸入指令確認服務:
systemctl enable (你的服務名).service
例如:systemctl enable blogcorr.service;
然后啟動服務 systemctl start blogcote.service
然后查看一下服務狀態:systemctl status blogcore 出現狀態說明服務運行正常。
( 借鑒:https://www.cnblogs.com/Tassdar/p/9587829.html )
6、Linux_CentOs_Nginx 部署
1、安裝.NET Core Runtime
首先需要安裝.NET Core Runtime: https://dotnet.microsoft.com/download/linux-package-manager/centos/runtime-current
點擊之后,根據您的Linux發行版不同,選擇相應的操作步驟:
操作動圖如下:
最后執行dotnet --info驗證安裝是否成功:
2、安裝Nginx
另外還需要安裝Nginx,
sudo yum install nginx
安裝完成后,啟用並啟動Nginx服務:
sudo systemctl enable nginx
sudo systemctl start nginx
啟動成功后,直接訪問你的 IP 地址,如果看到如下效果說明安裝成功:
指出個錯誤: CentOS上安裝了ng 路徑應該是IP+/usr/share/nginx/html才會到ng頁面。
3、Ftp將本地發布后的項目,打包上傳到服務器
1、發布的過程,省略。
2、上傳
3、上傳成功,檢查服務器是否存在
在我的目標目錄下,有這些文件:
如果執行 dotnet Blog.Core.dll,這個程序就會在localhost:8081運行:
4、配置Nginx
修改 nginx.conf 配置代理:
然后我們再回來配置Nginx,進入 /etc/nginx,然后 vi 修改nginx.conf ,保存
如果不會操作 Linux ,請查看我的這個文章:http://tibug.neters.club/details/68
upstream dotnetblogserver3 { server 127.0.0.1:8081; } server { listen 8082;#請注意,我的項目現在啟動的時候已經是 8081 了,這里就不要再監聽8081了,會報錯,隨便找個其他的端口 server_name localhost; location /{ proxy_pass http://dotnetblogserver3; index index.html index.htm; } location = /50x.html { root html; } }
修改后,重啟 nginx:
然后執行 nginx -s reload 來重啟nginx。
隨后需要再把程序運行一下:dotnet Blog.Core.dll 然后訪問我們的 ip:8081 地址。
成功:(臨時服務器,應該過期了)
5、守護進程
在/etc/systemd/system 下新建文件(推薦使用winscp),文件名以.service結尾,配置內容為(注意:中文注釋需要刪掉,否則部分 Linux 服務器會報錯):
[Unit]
Description=blogcore #服務描述,隨便填就好
[Service]
WorkingDirectory=/website/blogcore #工作目錄,填你應用的絕對路徑 ExecStart=/usr/bin/dotnet /website/blogcore/CZKJ.CMS.Web.dll #啟動:前半截是你dotnet的位置(一般都在這個位置),后半部分是你程序入口的dll,中間用空格隔開 Restart=always RestartSec=25 #如果服務出現問題會在25秒后重啟,數值可自己設置 SyslogIdentifier=blogcore #設置日志標識,此行可以沒有 User=root #配置服務用戶,越高越好 Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target
寫完配置文件后保存,輸入指令確認服務:
systemctl enable (你的服務名).service
例如:systemctl enable blogcore.service;
然后啟動服務 systemctl start blogcore.service
然后查看一下服務狀態:systemctl status blogcore 出現狀態說明服務運行正常。
( 借鑒:https://www.cnblogs.com/Tassdar/p/9587829.html )
---------------------------------------------------
7、Linux_Docker 部署
可以參考我的公眾號文章
https://mp.weixin.qq.com/s/JU4hTbsSbNkM5BwfBXUCiA
1、docker安裝
第一種方案:
依次執行下列命令
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum makecache fast sudo yum -y install docker-ce
第二種方案( 綠色的部分):
Install using the repository
Before you install Docker Engine - Community for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker from the repository.
SET UP THE REPOSITORY
-
Update the
apt
package index:$ sudo apt-get update
-
Install packages to allow
apt
to use a repository over HTTPS:$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
-
Add Docker’s official GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Verify that you now have the key with the fingerprint
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
, by searching for the last 8 characters of the fingerprint.$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
INSTALL DOCKER ENGINE - COMMUNITY
-
Update the
apt
package index.$ sudo apt-get update
-
Install the latest version of Docker Engine - Community and containerd, or go to the next step to install a specific version:
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
Got multiple Docker repositories?
If you have multiple Docker repositories enabled, installing or updating without specifying a version in the
apt-get install
orapt-get update
command always installs the highest possible version, which may not be appropriate for your stability needs. -
To install a specific version of Docker Engine - Community, list the available versions in the repo, then select and install:
a. List the versions available in your repo:
$ apt-cache madison docker-ce
查看詳細的命令,可以去官網來安裝:https://docs.docker.com/install/linux/docker-ce/ubuntu/
第三種方案:
如果你Linux系統是 Ubuntu 版本的,發現不能使用 yum 的話,可以使用 wget:
wget -qO- https://get.docker.com/ | sh
安裝成功后,可以啟動服務
sudo service docker start
檢查docker是否安裝成功:
docker version
若成功顯示如下:
完成之后,我們來使用docker來測試一下HelloWorld,通過輸入 docker pull hello-world 來拉取 hello-world 鏡像
root@VM-0-3-ubuntu:~# docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8 Status: Downloaded newer image for hello-world:latest
這樣我們就從倉庫拉取到了HelloWorld的鏡像,接下來我們來運行一下,通過輸入docker run hello-world
root@VM-0-3-ubuntu:~# docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
到這里,我們的 Linux 系統下 Docker 環境已經正式配置成功,下邊就是要正式部署我們的項目了。
2、Docker 部署
如果你有任何Docker部署的問題,可以聯系群友 @趙岩(305353941) ,專業的。
2.1、上傳文件到 linux 服務器
在 linux 下創建文件夾 BlogCoreAPI
mkdir BlogCoreAPI //創建文件夾
用 ftp 把發布的文件全部上傳到 BlogCoreAPI
2.2、添加 Dockerfile 文件
進入目錄 BlogCoreAPI
cd BlogCoreAPI
創建文件 Dockerfile
vim Dockerfile
內容如下,說明:鏡像里創建 blogcore 文件夾,復制 linux 上的文件到鏡像目錄,對外暴露 8101 端口,運行程序
FROM microsoft/aspnetcore:2.2 RUN cd /usr/local/src RUN mkdir blogcore WORKDIR /usr/local/src/blogcore COPY *.* ./ EXPOSE 8101 CMD ["dotnet", "Blog.Core.dll"]
保存
2.3、構建鏡像
鏡像名字叫 blogcore-image,禁用緩存,否則迭代時會出問題
docker build --no-cache -t blogcore-image . //注意這個點 . 表示當前目錄
2.4、運行容器
用鏡像 blogcore-image 創建容器,指定容器名稱是 blogcore-container,指定時區(默認是美國時間,相差8小時)
docker run --name=blogcore-container -dp 8101:8101--restart=always -e LC_ALL="en_US.UTF-8" -e TZ="Asia/Beijing" blogcore-image //修改默認時區到亞洲/北京,並且將容器里的 8101 端口映射到 linux 主機的 8101 端口,最后每次運行失敗后自動重啟
如果你想要查看剛剛創建的容器的時區是否成功,可以執行命令:
docker exec blogcore-container date //查詢當前容器時區
打開瀏覽器訪問試試:http://yourdomian.com/swagger/index.html
熱心博友提供知識:
@ Mr七師弟 的提醒:
提一個docker下的部署方法吧,
dockerfile中EXPOSE的端口是無效的。官方在定義dotnet基礎環境的時候, 設置了環境變量的端口是80 , 如果直接是 docker run -name -p 8101:8101 會出現無法訪問,此時執行docker logs containerID 會發現監聽的是80 端口, 那么, 講docker run 命令改成:docker run --name =[] -p8101:80 -d --resratr=always imsges 即可, 在瀏覽器輸入:localhost:8101就可以看到正常訪問
2.5、發布更新
上面說的是第一次發布,后期迭代,需要把容器刪除,再構建鏡像,運行容器。
2.5.1 刪除容器
docker container rm -f cchr-container
2.5.2 構建鏡像&運行容器
就和上邊的一樣了:
docker build --no-cache -t cchr-image . docker run --name=blogcore-container -dp 8101:8101--restart=always -e LC_ALL="en_US.UTF-8" -e TZ="Asia/Beijing" blogcore-image
我還不知道有沒有更快的方法,歡迎提建議。
8、PM2 做進程管理
我看到了很多教程,但是這里我嘗試的時候依然不行,這里先留一個坑,提供有償幫忙,如果有哪位會的話,可以聯系我,或者下邊留言 💴。
二、NetCore 錯誤
下邊的都是我平時遇到的常見的錯誤,如果大家還有其他錯誤,可以留言下來,我補充到文章中,讓更多的小伙伴都看到,避免麻煩。
0、調試靠斷點,部署靠日志
1、我最新的代碼已經基本包含了常見的五種日志,最常用的就是異常日志 Log\GlobalExceptionLogs_{yyyyMMdd}.log
2、如果項目根本啟動不了,就開啟IIS啟動日志
1、錯誤碼 —— 405
請求謂詞不支持,可以修改下IIS的配置。
解決方法:在web.config的system.webServer結點下添加如下代碼
<modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules>
2、錯誤碼 —— 500.00
解析:發布后啟動失敗,進程內,網友提供,暫時我還沒遇到
方案:
方法1:
應用池高級配置 - 啟動32位應用程序 - 設置為True
方法2:
web.config
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" startupTimeLimit="3600" requestTimeout="23:00:00" hostingModel="InProcess">
刪除 hostingModel="InProcess"
3、錯誤碼 —— 500.19
解析:未安裝 windows 服務器托管,打不開當前項目的 模塊 選項
方案:
安裝和項目匹配的 服務器托管( windows hosting ),這個是捆綁的可執行文件,除了托管,也把x86 和 x64的運行時都一起安裝好了。
4、錯誤碼 —— 500.21
解析:沒有安裝指定的模塊,如果你想問這個模塊是在項目哪里寫的,可以查看發布后的 web.config 文件
方案:
1、如果你沒有安裝上邊的 windows-hosting ,直接安裝就可以解決這個問題;
2、如果已經安裝了服務器托管,發現還沒有這個 V2 模塊,就是你項目的問題了,這個時候你可以從本地再發布 publish 一次,然后拷貝到服務器即可。
但是,如果還沒有的話,證明你本地開發的項目異常了,不過這個情況基本可以排除,只要是 SDK 2.2 開發的,本地
最終要確保 AspNetCoreModuleV2 模塊被安裝。
5、錯誤碼 —— 500.30
解析:進程內失敗,這個我沒有遇到,有群里小伙伴說的。
方案:
1、檢查檢查是否安裝了 host
6、錯誤碼 —— 500.35
檢查端口是不是沖突了,多半是IIS項目部署的時候,多個項目內部啟動端口沖突。
7、錯誤碼 —— 502.5
解析:1、沒有安裝指定的運行時,進程外啟動失敗。
2、還有可能是在發布的時候,缺少某些依賴dll文件,可以打開日志調試,請看下邊第七條。
3、或者使用 dotnet 命令行查看,是否有錯誤信息在控制台出現。
方案:
1、安裝指定版本的 Runtime 運行時。
一般情況下,只要安裝了服務器托管的話,會自動安裝對應版本的運行時,但是有時候安裝好了,還是會遇到這個錯誤,是因為我們后期項目迭代升級了:
舉個栗子,本來我們的項目是 Netcore 2.1 版本,后來更新到了 2.2 ,但是服務器的運行時還是舊的 Runtime 2.1 運行時,我們把代碼部署到服務器,發現沒有指定運行時,就會出現這個問題。
我這里是 2.2.4
下載地址:https://dotnet.microsoft.com/download/dotnet-core
2、感謝網友提供資料:@瘋言
502.5 另一種錯誤原因 一般缺少了文件,比如:Blog.Core.Repository.dll 和 Blog.Core.Services.dll
如果是IIS部署,查看啟動日志:
如果是命令行啟動,dos窗口看看錯誤信息。
附上解決方案 Blog.Core.Repository.dll 的處理,Blog.Core.Services.dll一樣
解決方案窗口中選中=》Blog.Core.Repository=》屬性=》生成事件=》生成后事件命令添加行代碼
Copy "$(OutDir)$(TargetFileName)" "$(SolutionDir)Blog.Core\$(TargetFileName)"
解釋:代碼目地把生成后的DLL拷貝到Blog.Core項目的根目錄中,
選中解決方案 重新生成解決方案,這時會在Blog.Core項目中出現Blog.Core.Repository.dll ; 然后選中Blog.Core.Repository.dll 屬性-》復制到輸出目錄=》選擇始終復制 ,當編譯生成時將自動把相關DLL拷貝到輸出目錄中
3、直接安裝指定版本的SDK,還不行重啟服務器。
8、錯誤碼 —— 503
解析:IIS 項目應用程序池未開啟
方案:開啟程序池即可,
但是經過測試發現,不使用 “無托管代碼” 也可以,這是為什么,很好奇?
9、An error occurred while starting the application
解析:項目已經可以啟動,證明環境已經正常,只不過在項目啟動的時候,出現了錯誤,也就是說是項目代碼的問題。
方案:查看日志,看項目文件是否齊全。
如果你不知道如何打開日志,請看另一篇文章的這一節:https://www.cnblogs.com/laozhang-is-phi/p/9565227.html#autoid-5-5-0
下邊這個錯誤,就是因為分離的原因,導致 Service.dll 和 Repository.dll ,或者 swagger 的xml 沒有拷貝到發布文件夾下,從而導致項目沒有啟動起來。
10、總結
經過上邊多個錯誤分析,如果我們第一次再服務器中部署,只需要安裝 服務器托管 Windows-hosting 即可:
https://dotnet.microsoft.com/download/dotnet-core/2.2
三、Vue 錯誤
1、跨域失敗
這都是很簡單的錯誤,根據上邊的動圖,咱們也能看出來,關於跨域有以下幾個方法:
1、IIS 部署,一定要在后端 NetCore 項目,進行 CORS 跨域;
2、除非你是在 IIS 中的同一個站點配置前后端兩個項目;
3、如果是 nginx+kestrel 的話,記得在 nginx 中配置跨域代理;
4、其他方案,略;
2、頁面刷新 404
為了這個錯誤,我上邊的第一個動圖,還特地的故意做了這個錯誤,就是 history 和 hash 的情況,當然也是有兩個方案:
如果是IIS部署
1、如果你是 IIS 部署,就使用 hash 模式;
2、如果用IIS,也想用 history 模式,可以配置 URL重寫:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90
https://www.iis.net/downloads/microsoft/url-rewrite
如果是Nginx部署:
1、不過如果用 nginx 的話,可以利用 404 頁面的機制,將 index.html 頁面 copy 一份,重命名成 404.html 即可;
2、如果不想添加一個 404 文件的話 ,就直接修改下 nginx 的配置文件(推薦)
3、IIS 無法導入組件
在 Blog.Admin 項目中,都嘗試下這兩個導入方式。
如果還不行,就直接修改下導入組件的地方吧(感謝群友@聽風者小伙伴提出的方案),不要說不知道這個代碼在哪里修改:
四、結語
這篇文章會一直補充,盡量成為前后端分離的一個優質文章吧,希望大家能盡自己的力量,補充下。
前后端分離到這里就差不多了,江湖很大,各位有緣再會!
( MSI加油!)
五、Github & Gitee
https://github.com/anjoy8/Blog.Core
https://gitee.com/laozhangIsPhi/Blog.Core
--- --- ---