前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Kestrel的ListenAnyIP和ListenLocalhost的区别

Kestrel的ListenAnyIP和ListenLocalhost的区别

作者头像
李明成
发布于 2020-08-04 08:35:11
发布于 2020-08-04 08:35:11
71900
代码可运行
举报
文章被收录于专栏:dotNET知音dotNET知音
运行总次数:0
代码可运行
问题

在上篇文章,把AAStore.ProductCatalog.Api部署到docker中运行,输入地址访问报错如下图,说明外部无法访问这个url。(当然本地开发环境测试是可以访问的)。后来修改此处options.ListenLocalhost(8081)的代码改成options.ListenAnyIP(8081),可以访问了。那这两种写法有什么区别呢?

在区别之前,我们先熟悉几个概念(如果网络知识比较好的,可以跳过):

本地回环地址(Loopback Address):

百度定义的定义,127.0.0.1,通常被称为本地回环地址(Loopback Address),不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。在Windows操作系统中也有相似的定义,所以通常在安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否正常的。

IPv6的本地回环地址形式:0:0:0:0:0:0:0:1,同IPV4中127.0.0.1地址的含义一样,表示节点自已,也可以是::1,大多数windows和linux电脑上都将localhost指向了127.0.0.1这个地址,相当于是本机地址。

ip地址类型

公有地址

公有地址(Public address)由Inter NIC(Internet Network Information Center因特网信息中心)负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。

私有地址

私有地址(Private address)属于非注册地址,专门为组织机构内部使用。以下列出留用的内部私有地址

  • A类 10.0.0.0--10.255.255.255
  • B类 172.16.0.0--172.31.255.255
  • C类 192.168.0.0--192.168.255.255

IPv6 [::] ( 0000:0000:0000:0000:0000:0000:0000:0000的简写), IPv4 0.0.0.0 含义:

维基百科解释,表示无效的,未知,不可用的目标

服务器中,常常表示监听本机所有的ip地址。一般我们在服务端绑定端口的时候可以选择绑定到0.0.0.0,这样就可以通过多个ip地址访问我的服务。

ListenLocalhost 和ListenAnyIP 区别

通过编码配置Kestrel监听端口有三个方法可以实现ListenLocalhost、ListenAnyIP、Listen,其中ListenLocalhost等同于Listen的IPAddress.IPv6Loopback 和IPAddress.Loopback,ListenAnyIP等同于Listen的IPAddress.IPv6Any和IPAddress.Any。下面我看看可以查看他们的源代码。

ListenLocalhost、ListenAnyIP 两个方法的源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

        /// <summary>
        /// Listens on ::1 and 127.0.0.1 with the given port. Requesting a dynamic port by specifying 0 is not supported
        /// for this type of endpoint.
        /// </summary>
        public void ListenLocalhost(int port, Action<ListenOptions> configure)
        {
            if (configure == null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            var listenOptions = new LocalhostListenOptions(port);
            ApplyEndpointDefaults(listenOptions);
            configure(listenOptions);
            ListenOptions.Add(listenOptions);
        }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /// <summary>
        /// Listens on all IPs using IPv6 [::], or IPv4 0.0.0.0 if IPv6 is not supported.
        /// </summary>
        public void ListenAnyIP(int port, Action<ListenOptions> configure)
        {
            if (configure == null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            var listenOptions = new AnyIPListenOptions(port);
            ApplyEndpointDefaults(listenOptions);
            configure(listenOptions);
            ListenOptions.Add(listenOptions);
        }

通过源码我们可以发现,他们之间的区别是在构造listenopthons对象不同,分别使用LocalhostListenOptions和AnyIPListenOptions进行new创建实例,而AnyIPListenOptions和LocalhostListenOptions都继承类ListenOptions,并且重写BindAsync方法。源码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  internal sealed class LocalhostListenOptions : ListenOptions
    {
        internal LocalhostListenOptions(int port)
            : base(new IPEndPoint(IPAddress.Loopback, port))
        {
            if (port == 0)
            {
                throw new InvalidOperationException(CoreStrings.DynamicPortOnLocalhostNotSupported);
            }
        }

        //绑定回环地址ipv4是127.0.0.1 ,iPV6是::1
        internal override async Task BindAsync(AddressBindContext context)
        {
            var exceptions = new List<Exception>();

            try
            {
                var v4Options = Clone(IPAddress.Loopback);
                await AddressBinder.BindEndpointAsync(v4Options, context).ConfigureAwait(false);
            }
            catch (Exception ex) when (!(ex is IOException))
            {
                context.Logger.LogWarning(0, CoreStrings.NetworkInterfaceBindingFailed, GetDisplayName(), "IPv4 loopback", ex.Message);
                exceptions.Add(ex);
            }

            try
            {
                var v6Options = Clone(IPAddress.IPv6Loopback);
                await AddressBinder.BindEndpointAsync(v6Options, context).ConfigureAwait(false);
            }
            catch (Exception ex) when (!(ex is IOException))
            {
                context.Logger.LogWarning(0, CoreStrings.NetworkInterfaceBindingFailed, GetDisplayName(), "IPv6 loopback", ex.Message);
                exceptions.Add(ex);
            }

            if (exceptions.Count == 2)
            {
                throw new IOException(CoreStrings.FormatAddressBindingFailed(GetDisplayName()), new AggregateException(exceptions));
            }

            // If StartLocalhost doesn't throw, there is at least one listener.
            // The port cannot change for "localhost".
            context.Addresses.Add(GetDisplayName());
        }

      
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 internal sealed class AnyIPListenOptions : ListenOptions
    {
        internal AnyIPListenOptions(int port)
            : base(new IPEndPoint(IPAddress.IPv6Any, port))
        {
        }

        //如果本机不支持 IPv6就绑定ipv4
        internal override async Task BindAsync(AddressBindContext context)
        {
            // when address is 'http://hostname:port', 'http://*:port', or 'http://+:port'
            try
            {
                await base.BindAsync(context).ConfigureAwait(false);
            }
            catch (Exception ex) when (!(ex is IOException))
            {
                context.Logger.LogDebug(CoreStrings.FormatFallbackToIPv4Any(IPEndPoint.Port));

                // for machines that do not support IPv6
                EndPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.Port);
                await base.BindAsync(context).ConfigureAwait(false);
            }
        }
    }

小结:通过以上分析,端口绑定时,建议使用IPAddress.Any,可以支持ipv6和ipv4地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 webBuilder.ConfigureKestrel(options =>
                    {
                        //1.ListenLocalhost方法
                        //options.ListenLocalhost(8081);

                        //2.ListenAnyIP方法
                        options.ListenAnyIP(8081);

                        //3.Listen方法
                        // options.Listen(IPAddress.Loopback, 8081);

                        // Setup a HTTP/2 endpoint without TLS.
                        options.ListenAnyIP(18081, o => o.Protocols =
                            HttpProtocols.Http1AndHttp2);
                    });

参考:https://juejin.im/post/5d258b6ae51d454f73356dcf

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 dotNET知音 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Cypress系列(17)- 查找页面元素的辅助方法
https://www.cnblogs.com/poloyy/category/1768839.html
小菠萝测试笔记
2020/06/19
2.3K0
JavaScript 学习-44.jQuery 遍历查找方法
前言 通过 jQuery 遍历,从被查找当前元素开始,在家族树中向上移动(祖先),向下移动(子孙),水平移动(兄弟),这种移动被称为对 DOM 进行遍历。 查找祖先元素 向上遍历 DOM 树,查找父元素和祖先元素 parent()   查找父元素 parents()  查找父元素以及祖先元素,一直到根节点html 示例 <div id="demo"> <h3>jquery 遍历</h3> <p id="p" class="text-info">hello world</p> <for
上海-悠悠
2022/06/14
8520
jQuery
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
chenchenchen
2023/01/30
4.7K0
JQuery常用方法总结
1.json的创建方式 <script> $(function () { //第一种 var my = new People("CallmeYhz", 26); alert("(1):" + my.name); //第二种 var you = { "name": "周公瑾", "age": 35 };
用户1055830
2018/01/18
1K0
JQuery常用方法总结
jquery 筛选元素 (3)
.addBack()   添加堆栈中元素集合到当前集合中,一个选择性的过滤选择器。   .addBack([selector])     selector     一个字符串,其中包括一个选择器表达式,匹配当前元素集合,不包括在内的元素。     <ul>       <li>list item 1</li>       <li>list item 2</li>       <li class="third-i
用户1197315
2018/01/19
1.4K0
jQuery 简介
https://www.runoob.com/jquery/jquery-syntax.html
zhangjiqun
2024/12/17
1080
jQuery 简介
jQuery学习笔记
jQuery大部分功能需要根据文档的DOM模型来工作,首先需要正确地解析到整个文档的DOM模型结构。使用jQuery需要在整个文档被浏览器完全加载后才开始进行。
用户9076598
2022/03/02
6350
jQuery
jQuery选择器 <script src="https://code.jquery.com/jquery-3.6.0.js" type="text/javascript" charset="utf-8"></script> <body> <ul> <li>1</li> <li class="a">2</li> <li>3</li> <li class="b">4</li> <li>5</li> <li class="c">6</li> <li>7</li
ymktchic
2022/01/18
1.8K0
jQuery
jQuery
当Jquery名称冲突时,可以利用var jq = jQuery.noConflict()来使用jq代替表示Jquery。
matt
2022/10/25
16.5K0
jQuery学习笔记
jQuery函数位于一个document ready函数中,我们需要在js中加载该函数文档
Mirror王宇阳
2020/11/13
7.5K0
jQuery学习笔记
[jQuery学习系列一]1-选择器与DOM对象
前言: 好久没有更新博客了, 最近想复习下 之前学过的JS的相关内容, 也算是自己的一种总结. 知识长时间不用就会忘记, 多学多记多用!! 下面的程序都可以在下面的网站进行在线调试:  http://
一枝花算不算浪漫
2018/05/18
2.9K0
【一起来烧脑】读懂JQuery知识体系
在现在就业的过程中,会运用JQuery是你的加分项,那么什么是JQuery,嗯,jquery是JavaScript的函数库,是一种轻量级的JavaScript库,写得少,做的多,导致jQuery有很多技术人员在使用它做项目。
达达前端
2019/07/16
2.6K0
【一起来烧脑】读懂JQuery知识体系
JavaWeb(八)JQuery
jQuery 市场用得比较多两个框架: jQuery 比较适合做一些互联网 的应用(12306.com,蘑菇街,美丽说,聚美) extjs 比较适合做后台管理系统(电商(订单管理),银行,电信) 核心: 主要功能:javascript开发人员查找元素、操作DOM、处理事件、执行动画和开发Ajax的操作。优势:(宗旨:write less ,do more 写更少的代码,做更多的事情) 1:轻量级 (js 库非常小) 2:强大的选择器(获取页面上面的dom 元素 document.getElementByI
二十三年蝉
2018/02/28
1.8K0
JQuery语法:查找+操作
jquery的基础语法:$(selector).action() 即查找元素.操作 一、查找元素(选择器和筛选器) 1.1 选择器 1.1.1 基本选择器
菲宇
2019/06/13
1K0
Cypress 页面元素基本操作方式
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家的支持。
wencheng
2020/07/16
8280
jQuery基础系列
jquery的入口函数是在html所有标签都加载后才执行,而JavaScript的window.onload事件是等到所有内容加载完后才执行。
达达前端
2019/07/03
2.6K0
jQuery基础系列
JQuery基础
学习jQuery的时候,很快过了一遍,发现好多知识点不清晰。看来还是要写出来加深印象,平时多练习! jQuery是一个Javascript函数库,轻量级,“写得少,做的多!”,它有以下功能: HTML元素选取 HTML元素操作 CSS操作 HTML事件函数 JavaScript特效和动画 HTML DOM遍历和修改 AJAX Utilities(实用工具) 很多大公司都在使用jQuery:Google,Microsoft,IBM等。jQuery兼容所有主流浏览器,包括IE6(不失为解决兼容性的一种方法)。
用户1149564
2018/01/11
4.8K0
JQuery基础
jquery树遍历
得到当前匹配的元素集合中每个元素的后代, 由一个选择器,jQuery对象,或元素过滤。
IT工作者
2022/03/02
8940
jQuery选择器大全(48个代码片段+21幅图演示)1
选择器是jQuery最基础的东西,本文中列举的选择器基本上囊括了所有的jQuery选择器,也许各位通过这篇文章能够加深对jQuery选择器的理解,它们本身用法就非常简单,我更希望的是它能够提升个人编写jQuery代码的效率。本文配合截图、代码和简单的概括对所有jQuery选择器进行了介绍,也列举出了一些需要注意和区分的地方。 一、基本选择器 1. id选择器(指定id元素) 将id="one"的元素背景色设置为黑色。(id选择器返单个元素) $(document).ready(function () {
逸鹏
2018/04/10
2K0
jQuery选择器大全(48个代码片段+21幅图演示)1
jQuery 遍历 - 祖先
parents() 方法返回被选元素的所有祖先元素,它一路向上直到文档的根元素 (<html>)。
陈不成i
2021/07/22
6770
相关推荐
Cypress系列(17)- 查找页面元素的辅助方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档