今天无意中发现一个变化,因为很久没看.net core的项目了,发现项目启动的默认端口已经不是5000了,记得很清楚,最早那还是.net core 1.x版本的时候,每次启动都会默认是5000端口号,而现在不是了。借此机会在来说一下,关于.net core项目修改默认端口号的解决方案,我们最熟知的是一种解决方案就是直接在Program.cs中创建WebHost对象的时候,使用UseUrls()方法,配置要使用的端口,如下所示:

这是我们再熟悉不过的修改方法了,启动以后,5001和5002端口都会开启监听,所以我们通过这两个地址都会访问到我们的网站。但是这种方式的缺点就是我们要修改代码,重新编译运行,这并不是我们想要的最好的解决方案,如果可以直接在配置文件中配置就完美了,便在一个个人博客里看到了一个方法,地址:http://benfoster.io/blog/how-to-configure-kestrel-urls-in-aspnet-core-rc2 添加一个json文件,叫做hosting.json,意为服务配置,当然起什么名字不重要,里面只需要添加一个节点即可,内容如下:

{
"server.urls": "http://localhost:5001;http://localhost:5002"
}

添加了一个server.urls节点,然后再修改Program.cs文件,

运行后,显示如下:

5001和5002端口都开启了监听。

这不禁引起了我的兴趣,便翻起了关于这一块儿的源码。关于Hosting的源码地址:https://github.com/aspnet/Hosting

下面我们层层深入,究其原因,查看IWebHost接口的Build方法:

/// <summary>
/// Builds the required services and an <see cref="IWebHost"/> which hosts a web application.
/// </summary>
public IWebHost Build()
{
if (_webHostBuilt)
{
throw new InvalidOperationException(Resources.WebHostBuilder_SingleInstance);
}
_webHostBuilt = true; var hostingServices = BuildCommonServices(out var hostingStartupErrors);
var applicationServices = hostingServices.Clone();
var hostingServiceProvider = GetProviderFromFactory(hostingServices); if (!_options.SuppressStatusMessages)
{
// Warn about deprecated environment variables
if (Environment.GetEnvironmentVariable("Hosting:Environment") != null)
{
Console.WriteLine("The environment variable 'Hosting:Environment' is obsolete and has been replaced with 'ASPNETCORE_ENVIRONMENT'");
} if (Environment.GetEnvironmentVariable("ASPNET_ENV") != null)
{
Console.WriteLine("The environment variable 'ASPNET_ENV' is obsolete and has been replaced with 'ASPNETCORE_ENVIRONMENT'");
} if (Environment.GetEnvironmentVariable("ASPNETCORE_SERVER.URLS") != null)
{
Console.WriteLine("The environment variable 'ASPNETCORE_SERVER.URLS' is obsolete and has been replaced with 'ASPNETCORE_URLS'");
}
} var logger = hostingServiceProvider.GetRequiredService<ILogger<WebHost>>();
// Warn about duplicate HostingStartupAssemblies
foreach (var assemblyName in _options.GetFinalHostingStartupAssemblies().GroupBy(a => a, StringComparer.OrdinalIgnoreCase).Where(g => g.Count() > 1))
{
logger.LogWarning($"The assembly {assemblyName} was specified multiple times. Hosting startup assemblies should only be specified once.");
} AddApplicationServices(applicationServices, hostingServiceProvider); var host = new WebHost(
applicationServices,
hostingServiceProvider,
_options,
_config,
hostingStartupErrors);
try
{
host.Initialize(); return host;
}
catch
{
// Dispose the host if there's a failure to initialize, this should clean up
// will dispose services that were constructed until the exception was thrown
host.Dispose();
throw;
}

在Build方法里主要是初始化了一个WebHost对象,再进入WebHost的源代码,

private void EnsureServer()
{
if (Server == null)
{
Server = _applicationServices.GetRequiredService<IServer>(); var serverAddressesFeature = Server.Features?.Get<IServerAddressesFeature>();
var addresses = serverAddressesFeature?.Addresses;
if (addresses != null && !addresses.IsReadOnly && addresses.Count == 0)
{
var urls = _config[WebHostDefaults.ServerUrlsKey] ?? _config[DeprecatedServerUrlsKey];
if (!string.IsNullOrEmpty(urls))
{
serverAddressesFeature.PreferHostingUrls = WebHostUtilities.ParseBool(_config, WebHostDefaults.PreferHostingUrlsKey); foreach (var value in urls.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
{
addresses.Add(value);
}
}
}
}
}

不难找到是在上述方法里面,添加的URL地址,在这行代码中:

var urls = _config[WebHostDefaults.ServerUrlsKey] ?? _config[DeprecatedServerUrlsKey];

W这里的URL判断,如果当前默认的配置为空则使用后面的配置,而DepreacatedServerUrlsKey在一开始就已经定义了,

private static readonly string DeprecatedServerUrlsKey = "server.urls";

该参数的默认值为server.urls,所以我们在hosting.json中直接配置该键值对,.net core启动后会自动读取配置文件,使用配置的端口。其他相关配置,大家就自行搜索吧。

细心的小伙伴会发现在源代码中,还有两处是关于配置Url的,一处是在上面的Build方法中,有一处判断:

if (Environment.GetEnvironmentVariable("ASPNETCORE_SERVER.URLS") != null)
{
Console.WriteLine("The environment variable 'ASPNETCORE_SERVER.URLS' is obsolete and has been replaced with 'ASPNETCORE_URLS'");
}

如果在环境变量中ASPNETCORE_SERVER.URLS不为空的话,这个值就会替换ASPNETCORE_URLS的值,另外在WebHostBuilder的构造函数中,也有一段判断代码

if (string.IsNullOrEmpty(GetSetting(WebHostDefaults.ServerUrlsKey)))
{
// Try adding legacy url key, never remove this.
UseSetting(WebHostDefaults.ServerUrlsKey, Environment.GetEnvironmentVariable("ASPNETCORE_SERVER.URLS"));
}

如果获取的默认的配置中urls的值为空,那么就启用ASPNETCORE_SERVER.URLS环境变量中的配置,这也告诉我们我们还可以把启动的端口放到环境变量中,右键项目属性,选择调试,

添加环境变量ASPNETCORE_SERVER.URLS配置,以上就是我总结的修改默认启动端口的所有方法了,如果还有其他的方法,欢迎留言。

晚安。

扫描二维码关注我的公众号,共同学习,共同进步!

.Net Core 修改默认的启动端口的更多相关文章

  1. LINUX SSH修改默认22/添加端口

    通常ssh远程登录的默认端口是22,但是因为端口22属于高危端口,因此很多时候作为服务器会被关掉,不过这个端口一般是可以更改或者添加的,这样除了22端口,也可以通过别的端口进行访问. 1.首先修改配置 ...

  2. 你需要知道的这几种 asp.net core 修改默认端口的方式

    一般情况下,aspnetcore发布后的默认端口是5000,这个大家都知道,而且默认骨架代码中没有看到任何让你输入的ip地址和端口号,但作为程序员的我们,不希望 被框架所管制,那如何实现默认端口的修改 ...

  3. wamp 修改默认apache 80端口

    wamp server 环境安装包 修改默认80端口 D:\wamp\bin\apache\apache2.4.9\conf\httpd.conf 找到如下代码出修改后,重启apache即可 ## L ...

  4. 【Jenkins】Jenkins安装修改默认路径和端口的方法

    一.修改默认的jenkins安装路径 因为jenkins默认安装在c盘 C:\Users\Administrator\.jenkins下,那怎样将安装路径修改至d盘呢? 新建一个系统变量:JENKIN ...

  5. 一、Asp.Net Core WebAPI——修改默认监听端口

    参考文档 添加host.json文件 { "urls": "https://localhost:44389;http://localhost:44380" } ...

  6. 阿里云修改默认的ssh端口

    Linux服务器的ssh服务支持远程访问服务器,默认的ssh端口号是22.为了安全起见,很多用户会将端口号由22改为其他的端口号.  如果遇到修改端口号并重启ssh服务后,新的端口号不生效,请参考以下 ...

  7. oracle 11g 修改默认监听端口1521

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  8. nginx修改默认运行80端口的方法

    修改方法 很简单,修改nginx的配置文件, 对应的值,如图: 将其改为别的端口号,就可以了.

  9. 关于修改react的启动端口

    在package.json文件里面,加一个port端口号就ok了

随机推荐

  1. abap编辑器中代码不可修改

    当出现abap编辑器中代码不能修改的情况,可以按如下设置: edit——> 修改操作——>关闭助手

  2. ckeditor的使用实例

    1.编辑器下载: https://pan.baidu.com/s/1ex3zCVuQsMz8opk75zadPw 2.静态页面中加载 ckeditor.js <script src=" ...

  3. POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage

    题目:http://poj.org/problem?id=2318 题意: 给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数.(其中这些线段 ...

  4. 11g ASM新特性

    Oracle 11g的ASM有两个有意思的特性,我们看看他们能带给我们什么? 1.Fast mirror resync 原来当diskgroup中的盘发生故障时,Oracle会将这个盘标记为offli ...

  5. centos6.8安装zabbix

    前后用了两台电脑来实验,前后画风不一样,请忽略 一.安装php环境 移除目前系统安装的 PHP 组件 yum remove php* -y 安装 PHP 的 YUM 源  rpm -Uvh http: ...

  6. Http协议面试题

    1.说一下什么是Http协议? 对器客户端和 服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”. 2.什么是Http协议无状态协议?怎么解决Http协议无状态协议?(曾经去某创业公司问到) ...

  7. iOS开发之XMPPFramework环境搭建和配置

    1.mysql数据库安装和配置 官方下载地址:http://www.mysql.com/downloads/ 百度云盘地址: 安装软件参考:http://www.cnblogs.com/macro-c ...

  8. ffmpeg下载安装和简单应用

    先介绍一下ffmpeg:FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影.转换.流功能,包含了libavcodec —这是一个用于多个项目中音频和视频的解码器库,以及libavformat ...

  9. c++ 中 BOOL与bool TRUE与true FALSE与false 区别

    转自:http://blog.chinaunix.net/uid-28458801-id-3941112.html   FALSE/TRUE与false/true的区别 1.FALSE/TRUE与fa ...

  10. 解决Linux 下server和client 通过TCP通讯:accept成功接收却报错的问题

    今天在写简单的TCP通讯例子的时候,遇到了一个问题:server 和client能够连接成功,并且client也能够正常发送,但server就是接收不到,在网上搜索一番后,终于解决了问题.在这里整理如 ...