写在前面的话
其实很多情况不需要这么麻烦,基于公司项目现状,这是比较方便的做法:把.Net Core项目发不成.exe文件,然后使用Windows服务的方式启动.exe文件
我知道可以直接将.net core项目发布成Windows服务,并且.exe也不需要通过Windows服务就可以直接运行了
一、事件起因
之前我们的项目windows平台是部署在IIS上的,但是出现一个问题:WebSocket长连接数量超过10个,IIS就罢工了,不接受任何请求,导致页面卡死(目前没有想到很好的办法解决,有好的办法请告诉我,谢谢大家),一断开websocket连接,页面就恢复正常了
二、排查过程
一开始的时候,使用IIS,长连接数超过10个页面就卡死,但是在Linux下部署没有问题的,所以,一开始就怀疑是IIS的问题,
验证方法:通过CMD命令行的方式启动项目,结果没问题
到此,基本确定只要不使用IIS部署,就不会有问题了
三、解决方案
把原有.Net Core项目发布成.exe文件(可以直接双击运行的,但是会有一个控制台窗口),然后把.exe封装到Windows服务里面
1、.Net Core项目发布成.exe文件
1)修改GDSMPlateForm.csproj文件
在<PropertyGroup>节点下,添加
<OutputType>Exe</OutputType>
<RuntimeIdentifier>win10-x64</RuntimeIdentifier>
注:系统类型看自己运行环境
2)使用cmd命令发布
打开cmd,进入.csproj文件所在文件夹,然后执行dotnet publish GDSMPlateForm.csproj
如上图,发布成功,发布文件路径:D:\web代码\GDSM4.1\GDSMPlateForm\GDSMPlateForm\bin\Debug\netcoreapp2.0\win10-x64\publish
3)运行.exe文件
双击GDSMPlateForm.exe文件
如上图,运行成功,可以直接在浏览器访问,http://localhost:5000
2、把.exe封装到Windows服务里
使用Nssm 搭建windows服务
1) 下载nssm : http://www.nssm.cc/download
publish文件夹(文件夹名称可以随便取),放发布文件
2)安装服务
进入cmd命令行,安装服务: nssm install GDSMService 服务名称可以随便取
弹出窗口,Application Path:发布文件夹的.exe文件,我的是C:\Users\JH-TEST\Downloads\nssm-2.24\nssm-2.24\win64\publish\GDSMPlateForm.exe
Startup directory:发布文件夹,我的是C:\Users\JH-TEST\Downloads\nssm-2.24\nssm-2.24\win64\publish
Arguments:不用填
最后,点击Install Service
安装成功
3)启动服务
可以看到刚安装的服务,右键启动
启动成功,到此为止,把.net core发布成.exe并通过windows服务启动,就完成了
4)卸载服务
使用命令: sc delete GDSMService
注意:要先停止服务,再卸载,否则会出现虽然服务已经删了,但是之前的服务还在运行
总结:这个解决方案可能不是最好的,但是就目前的问题来说确实达到了目的,后续可能会考虑,改写代码,直接搞一个可以发布成windows服务的版本,
更重要的是为了记录一下这个问题吧,方便自己查阅,好记性不如烂笔头嘛