栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

[强制Https].net6.0 创建Web服务引起的异常退出

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[强制Https].net6.0 创建Web服务引起的异常退出

.net6.0 创建Web服务引起的异常退出
  • .net6.0 创建Web服务引起的异常退出
    • 问题
    • 排错
    • 初步分析
    • 破案
    • 解决方案
    • 真相只有一个

.net6.0 创建Web服务引起的异常退出

开发平台: .net6.0-preview
开发工具: Visual Studio 2022 preview

问题

一只测试得很稳定的服务外挂程序(打包成控制台程序),挂个WebService服务做消息转发集成用的。昨天开始,为了在某个测试客户的服务器上做个WebAPI测试验证(对下位系统用API,对上层系统用Service),应该很简单的事情,我在代码里面加了API的接口,postman在本地一顿操作输出日志,JSON转XML,一切看起来完美无瑕。

直到昨天晚上开始(从我现在写博客的时间算起,嗯,是前天了),我试着在客户服务器上部署测试看看,结果意外发现,程序闪退了,而且这个闪退很诡异在于,它Console输出了主Project需要加载的各个子模组之后,停顿5秒钟左右自动闪退,而且Main函数里面下全局异常也捕获不到,最开始怀疑是Web服务监听的端口在服务器上可能被其他程序占用了,关掉防火墙,换端口依然无效。
Main函数如下:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler((object sender, UnhandledExceptionEventArgs e)=>
                {
                    Log.Fatal(e.ExceptionObject.ToString());
                    Console.WriteLine(e.ExceptionObject.ToString());
                    Console.ReadKey();
                    //throw new Exception(e.ExceptionObject.ToString());
                });

                BattlefieldBuilder += CreateOperationModule;
                BattlefieldBuilder += CreateHistoryRecorder;
                BattlefieldBuilder += CreateTransactionsCenter;
                BattlefieldBuilder += CreatePlugInModule;
                BattlefieldBuilder += CreateHostService;
                BattlefieldBuilder();
排错

由于问题发生得过于诡异,我尝试着在Main函数里面各种下Console输出,依然闪退。于是用排除法,我把程序打包,配套.net6.0-preview最新的SDK发给同事电脑(非开发人员),同事安装完SDK并且跑程序一样闪退!
我再把程序打包,发给另一外开发人员(同样的.net 6.0-preview开发环境),这位同事运行一切正常!

初步分析

两个同样安装了最新版Visual Studio 2022 preview版的开发主机运行正常,但换到其他主机,即便主机上下载安装了巨硬官网最新的.net 6.0 SDK,依然闪退,而且是正常运行后闪退。
推测应该是系统环境问题。
于是我仔细对比了开发主机与非开发主机,包括客户测试服务器上,C盘下dotnet文件夹下各个与netcore相关的dll的版本号,均无二致,我甚至开始怀疑是windows系统补丁在作怪了。

破案

要坚信代码是不会骗人的!
我从Main函数开始,逐行代码注释运行,功夫不符有心人,果然灯下黑!当某句代码注释后,非开发环境主机上运行居然不闪退了!
注释后可以正常运行的代码:

BattlefieldBuilder += CreateOperationModule;
BattlefieldBuilder += CreateHistoryRecorder;
BattlefieldBuilder += CreateTransactionsCenter;
BattlefieldBuilder += CreatePlugInModule;
//BattlefieldBuilder += CreateHostService;
BattlefieldBuilder();

可是很尴尬呀,注释掉的这个CreateHostService是这支程序注入服务的入口,这可是.netcore之后版本的一大特色用法啊,怎么问题发生在服务注入了?
于是跳转进CreateHostService继续排查:

        internal static void CreateHostService() => Host.CreateDefaultBuilder().ConfigureAppConfiguration((host, config) => config.SetBasePath(Directory.GetCurrentDirectory())).UseWindowsService().ConfigureWebHostDefaults(builder =>
        {
            builder.UseKestrel();
            builder.UseContentRoot(Directory.GetCurrentDirectory());
            builder.UseUrls(string.Concat(string.Format(UniversalLabel.HyperTextTitle.ToDesc(), Newsletter.LocalWebsite.IP), Newsletter.LocalWebsite.Port), string.Concat(string.Format(UniversalLabel.SecurityTextTitle.ToDesc(), UniversalSymbol.Star.ToDesc()), Newsletter.LocalWebsite.Port + First)); string.Concat(string.Format(UniversalLabel.SecurityTextTitle.ToDesc(), UniversalSymbol.Star.ToDesc()), Newsletter.LocalWebsite.Port + First));

            builder.ConfigureServices(services =>
            {
                ///业务逻辑
            }).Configure(app =>
            {
                ///业务逻辑
        }).UseSerilog(dispose: true).Build().Run();

最终,好家伙,通过逐行注释找到了真凶:

builder.UseUrls(string.Concat(string.Format(UniversalLabel.HyperTextTitle.ToDesc(), Newsletter.LocalWebsite.IP), Newsletter.LocalWebsite.Port), string.Concat(string.Format(UniversalLabel.SecurityTextTitle.ToDesc(), UniversalSymbol.Star.ToDesc()), Newsletter.LocalWebsite.Port + First));

这里边有我的一些全局的变量赋值,用人话说,搞鬼的这句代码是用UseUrls声明了Web服务地址监听的端口,传了http跟https两种类型。

凶手找到了,但是“杀人动机”我还是不明白:最开始我就通过更换预设的端口号,关闭防火墙等方法排除过,指定的端口号本身是可以用的没问题。那为何这句好端端的一个监听端口的声明,会导致程序自动退出?为何开发环境正常,非开发环境就报异常?

解决方案
  1. 代码修改如下:
builder.UseUrls(string.Concat(string.Format(UniversalLabel.HyperTextTitle.ToDesc(), Newsletter.LocalWebsite.IP), Newsletter.LocalWebsite.Port));

继续用人话来说,UseUrls拿掉了https的端口参数,只传http的端口,打包丢非开发环境验证,终于恢复正常了。

然而,我还是觉得哪里不对劲!

  1. 代码不改,我就是想同时设置http跟https,毕竟http不加密啊,怎么办?
    求助度娘后,终于让我找到了办法!
    命令行输入:dotnet dev-certs https --trust
    执行

不用怕,大胆的选“是”!
代码不作任何变动,启动,完美运行!

参考:
net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

真相只有一个

好吧,太困了,真相我其实还没找到。简单翻阅了一下巨硬的官方DOC,似乎有介绍到ASP.NETCore对于HTTPS的强制启用方法,但还是没理解为何非开发环境下需要用dotnet命令行强制启用https。
先在此留个路标在中强制实施 HTTPS ASP.NET Core,等有空再研究看看,也欢迎了解个中缘由的小伙伴留言解惑哈~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号