快速搭建CentOS+ASP.NET Core环境支持WebSocket
以前用python,go嘗試在linux下做web服務(wù),python沒(méi)有強(qiáng)類型支持與高性能,go又沒(méi)有很好的集成開(kāi)發(fā)環(huán)境(還有強(qiáng)迫癥的語(yǔ)法),回頭看了幾次.net,都沒(méi)有時(shí)間嘗試,現(xiàn)終于實(shí)現(xiàn)了這些想法,與大家分享。做web大項(xiàng)目,做工程,必須要有稱手的工具幫我調(diào)試、測(cè)試、開(kāi)發(fā)。工程化很重要,VS是一個(gè)稱職好選手。
環(huán)境:CentOS 7.x,.net core 2
以下.net core 2安裝操作為官方方法。如果你使用Docker,那么更簡(jiǎn)單了,只需要docker pull microsoft/dotnet就可以了。如果你使用Bash On Windows,那么與實(shí)際對(duì)應(yīng)的Linux子系統(tǒng)安裝完全相同。
https://www.microsoft.com/net/learn/get-started/linux/centos
CentOS安裝.net core(其他系統(tǒng)在這個(gè)頁(yè)面都可以選擇,包括:RHEL、Ubuntu、Debian、Fedora、openSUSE):
依次執(zhí)行(root下沒(méi)有sudo也可以):
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'
sudo yum update
sudo yum install libunwind libicu
sudo yum install dotnet-sdk-2.1.101
只需要這幾部,.net core 2就安裝好了。
用dotnet命令創(chuàng)建空web項(xiàng)目,編譯測(cè)試:
dotnet new web -o wstest dotnet build wstest dotnet run --project wstest注:dotnet new 命令會(huì)幫你創(chuàng)建項(xiàng)目,包括文件夾,必要的項(xiàng)目文件。build與run命令之前可以cd wstest,這樣就可以免去后面的參數(shù),把當(dāng)前目錄當(dāng)作操作對(duì)象。
注:可以再簡(jiǎn)潔點(diǎn):dotnet run -p wstest。編譯運(yùn)行一起完成。
無(wú)意外的話,項(xiàng)目已經(jīng)啟動(dòng),并且在localhost(端口默認(rèn)是5000)開(kāi)始監(jiān)聽(tīng)http請(qǐng)求。做這些事情的方便快捷是python、go、node.js、PHP、JAVA等等不能比的。當(dāng)然,如果你在Windows下,就更快了,包括后續(xù)的編碼、調(diào)試、測(cè)試。
接下來(lái),我們進(jìn)入WebSocket階段。
1、我們先創(chuàng)建一個(gè)html文件,放到項(xiàng)目的wwwroot目錄下,用于測(cè)試WebSocket。
<!DOCTYPE html>
<html>
<body>
? ? <div id="out"></div>
? ? <script>
? ? ? ? var ws = new WebSocket("ws://127.0.0.1:5000/ws")
? ? ? ? ws.onopen = function () {
? ? ? ? ? ? log("open")
? ? ? ? }
? ? ? ? ws.onmessage = function (ev) {
? ? ? ? ? ? log(ev.data)
? ? ? ? }
? ? ? ? function log(text) {
? ? ? ? ? ? out.innerHTML+="<div>"+text+"</div>"
? ? ? ? }
? ? </script>
</body>
</html>
2、開(kāi)啟asp.net的靜態(tài)文件訪問(wèn)與WebSocket支持。Linux下的asp.net宿主服務(wù)Kestrel已經(jīng)支持WebSocket,可以直接運(yùn)行。
在Startup.cs的public?Configure成員函數(shù)中添加:
app.UseWebSockets(); app.UseStaticFiles();3、為Startup.cs的Startup類添加WebSocket處理方法(成員函數(shù)):
async Task Echo(HttpContext ctx, WebSocket ws)
? ? ? ? {
? ? ? ? ? ? var bytes = System.Text.UTF8Encoding.UTF8.GetBytes("ok");
? ? ? ? ? ? var buff = new ArraySegment<byte>(bytes);
? ? ? ? ? ? await ws.SendAsync(buff, WebSocketMessageType.Text, true, System.Threading.CancellationToken.None);
? ? ? ? }
4、再為Startup.cs的public Configure成員函數(shù)添加處理函數(shù),可選擇去掉app.Run的調(diào)用:
app.Use(async (context, next) =>
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (context.WebSockets.IsWebSocketRequest)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? WebSocket ws = await context.WebSockets.AcceptWebSocketAsync();
? ? ? ? ? ? ? ? ? ? await Echo(context, ws);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? await next();
? ? ? ? ? ? });
5、Startup.cs文件的頭部添加引用:
using System.Net.WebSockets;?
代碼就這么多了。接下來(lái)驗(yàn)證結(jié)果。
?
注意:
1、如果你放到華為云、騰訊云,這樣有安全組的服務(wù)器上,你需要開(kāi)啟之前提到的端口TCP轉(zhuǎn)入權(quán)限。
2、test.html中的websocket地址請(qǐng)更換為實(shí)際的服務(wù)器地址與端口。
3、動(dòng)態(tài)IP支持的云主機(jī)自己是不知道自己的外網(wǎng)IP地址的,所以只能監(jiān)聽(tīng)0.0.0.0端口或者內(nèi)外綁定的端口。
4、注意自己的防火墻是否放行對(duì)應(yīng)的端口,可用iptables或firewall-cmd查詢,CentOS7默認(rèn)采用firewall-cmd作為防火墻的操作端。iptables也可以,但是不能保存。可安裝iptables-services解決。
?
dotnet run以后,你可以找個(gè)瀏覽器訪問(wèn)你的http服務(wù)了。
如果順利,你可以看到頁(yè)面輸出ok字樣。說(shuō)明,asp.net core的靜態(tài)頁(yè)面已經(jīng)輸出,并且頁(yè)面用WebSocket協(xié)議訪問(wèn)我們的http服務(wù)。
?
不順利的可能基本是監(jiān)聽(tīng)的IP地址無(wú)法訪問(wèn)或端口未開(kāi)放。
另一個(gè)原因是dotnet創(chuàng)建的項(xiàng)目里沒(méi)有項(xiàng)目配置文件,你可能不知道怎么配置監(jiān)聽(tīng)ip與端口。下面是launchSettings.json文件。你應(yīng)該把它放到項(xiàng)目的Properties文件夾中。它是我從VisualStudio向?qū)傻奈募刑崛〉摹?/p>
{
? "profiles": {
? ? "anyname": {
? ? ? "commandName": "Project",
? ? ? "launchBrowser": true,
? ? ? "environmentVariables": {
? ? ? ? "ASPNETCORE_ENVIRONMENT": "Development"
? ? ? },
? ? ? "applicationUrl": "http://0.0.0.0:5000/"
? ? }
? }
}
好了,祝你順利!
原文:https://www.cnblogs.com/fyter/p/linux_centos_aspnet_core_websocket.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的快速搭建CentOS+ASP.NET Core环境支持WebSocket的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: aspnetcore.webapi实践k
- 下一篇: dotnet watch+vs code