ASP.NET Core的Kestrel服务器

Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。

Kestrel支持以下功能:

  • HTTPS

  • 用于启用不透明升级的WebSockets

  • 位于Nginx之后的高性能Unix sockets

Kestrel 被.NET Core支持的所有平台和版本所支持

查看或下载示例代码

何时使用Kestrel和反向代理服务器

如果你的应用只接收来自内部网络的请求,你可以只使用Kestrel本身。

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 658px; height: 167px;">

如果你将你的应用部署在公共网络上,我们建议你使用IIS,Nginx或者Apache作为反向代理服务器。一个反向代理服务器接收来自网络的HTTP请求并且在经过一些初步处理后将请求传递到Kestrel服务器。

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 658px; height: 118px;">

出于安全性的理由,反向代理常常被edge deployments所采用。因为Kestrel相对较新,对抵御安全攻击至今还没有一个完整的功能补充。安全性处理包括但不限于适当的超时,大小的限制,以及并发连接限制等问题。

另一个需要反向代理的场景是,你有多个需要在单独的服务器上运行并分享同一端口的应用。因为Kestrel不支持在多进程间分享同一端口,所以应用并不能直接和Kestrel合作。当你在某个端口上配置Kestrel运行侦听时,不算主机头如何标识,Kestrel会为该端口处理所有的流量。反向代理可以为多个应用共享唯一端口并将流量发送给Kestrel。

即使不需要反向代理服务器,使用它也可以简化负载均衡和SSL设置 -- 只要你的反向代理服务器需要SSL证书,并且该服务器可以和你的应用在内部网中通过普通HTTP进行通信。

如何在ASP.NET Core应用中使用Kestrel

安装 Microsoft.AspNetCore.Server.Kestrel Nuget包。

在应用的Main方法中调用WebHostBuilderUseKestrel 扩展方法,指定你需要的Kestrel选项,如以下示例所示:

public static int Main(string[] args){Console.WriteLine("Running demo with Kestrel.");    var config = new ConfigurationBuilder().AddCommandLine(args).Build();    var builder = new WebHostBuilder().UseContentRoot(Directory.GetCurrentDirectory()).UseConfiguration(config).UseStartup<Startup>().UseKestrel(options =>{            if (config["threadCount"] != null){options.ThreadCount = int.Parse(config["threadCount"]);}}).UseUrls("http://localhost:5000");    var host = builder.Build();host.Run();    return 0;
}

URL 前缀

默认情况下,ASP.NET Core项目绑定了http://localhost:5000。通过使用UseUrls扩展方法——编辑urls命令行参数,或者是通过ASP.NET Core配置系统,你可以为Ketrel配置URL前缀和端口号以用来侦听请求。关于这些方法更多的信息,请参考Hosting。有关于当你使用IIS作为反向代理时,URL绑定是如何工作的信息,请参考ASP.NET Core 模块。

Kestrel URL前缀可以是以下格式中的任一种。

  • IPv4 地址和端口号

http://65.55.39.10:80/https://65.55.39.10:443/
  • IPv6 地址和端口号

http://[0:0:0:0:0:ffff:4137:270a]:80/ https://[0:0:0:0:0:ffff:4137:270a]:443/

IPv6中的 [::] 等价于 IPv4 0.0.0.0。

  • 主机名和端口号

http://contoso.com:80/http://*:80/https://contoso.com:443/https://*:443/

主机名称,*,以及+,都不是特殊的。任何没有公认的IP 或是“localhost”的地址将绑定到所有的IPv4和IPv6的IP上。如果你需要为不同的ASP.NET Core应用在同一端口上绑定不同的主机名,请使用WebListener或者诸如IIS,Nginx或Apache这样的反向代理服务器。

* "Localhost" 名称和端口号或回送IP地址和端口号

http://localhost:5000/http://127.0.0.1:5000/http://[::1]:5000/

localhost被指定时,Kestrel会尝试去绑定到IPv4和IPv6的环回接口。如果被请求的端口号正在任一环回接口上被其他服务所使用,Kestrel将会启动失败。如果任一环回接口出于各种原因而不可用(最通常的情况是因为IPv6暂不被支持),Kestrel将记录下一个警告信息。

  • Unix socket

http://unix:/run/dan-live.sock

如果你指定了端口号0,Kestrel将动态地绑定到合适的端口号。除了localhost名称,绑定到0端口号被其他任何主机名称或IP地址所允许。

当你指定了端口号0,你可以使用IServerAddressesFeature接口去决定运行时Kestrel实际绑定到哪个端口。下列示例用于获取绑定端口并且在console上显示出来。

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory){loggerFactory.AddConsole();    var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();app.UseStaticFiles();app.Run(async (context) =>{context.Response.ContentType = "text/html";        await context.Response.WriteAsync("<p>Hosted by Kestrel</p>");        if (serverAddressesFeature != null){            await context.Response.WriteAsync("<p>Listening on the following addresses: " +                    string.Join(", ", serverAddressesFeature.Addresses) +                    "</p>");}        await context.Response.WriteAsync($"<p>Request URL: {context.Request.GetDisplayUrl()}<p>");});
}

SSL的URL前缀

如果你调用UseSSL扩展方法,请确保在https:中包含URL前缀,如下所示:

var host = new WebHostBuilder() .UseKestrel(options => { options.UseHttps("testCert.pfx", "testPassword"); }) .UseUrls("http://localhost:5000", "https://localhost:5001") .UseContentRoot(Directory.GetCurrentDirectory()) .UseStartup<Startup>() .Build();

Note

HTTPS和HTTP不能在同一端口上被托管。

下一步

更多的信息,请参考以下资源:

  • Sample app for this article

  • Kestrel source code

  • Your First ASP.NET Core Application on a Mac Using Visual Studio Code

本教程在本地仅使用Kestrel,在将该应用部署到Azure之后,它将在Windows上使用IIS作为反向代理服务器。

原文地址:http://www.cnblogs.com/Wddpct/p/6123653.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RandomAccessFile

转载自 RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的&#xff0c;你就可以用seek( )方法来访问记录&#xff0c;并进行读写了。这些记录的大小不必相同&#xff1b;但是其大小和位置必须是可知的。但是该类仅限于操作文件。 RandomAccessFile不属于I…

JSR303常见参数

常见参数 NotNull(message "名字不能为空")private String userName;Max(value 120, message "年龄最大不能查过120")private int age;Email(message "邮箱格式错误")private String email;空检查Null 验证对象是否为nullNotNull 验证对象是…

解决:Could not find metadata org.apache.maven.plugins:maven-archetype-plugin/maven-metadata.xml in loc

我的方法 1.电脑可以Google 你要开启那个小飞机 2.笔记本连接手机热点 3.重新操作秒下下来 总结&#xff1a; 公司的网太差 &#xff0c; 也有可能做了外网访问的限制 下面是一个大神的方法 https://blog.csdn.net/Ajax_mt/article/details/81870086 解决:Could n…

Linux 临时表空间满了,Temporary表空间100%解决方案

说明&#xff1a;temp表空间的TS# 为 3*, So TS# 1 4一下是摘自Metalink的说明The DROP_SEGMENTS event~~~~~~~~~~~~~~~~~~~~~~~Available from 8.0 onwards.DESCRIPTIONFinds all the temporary segments in a tablespace which are notcurrently locked and drops them.For t…

Ajax传递json数据

Ajax的传递json数据的实现&#xff1a; 看这篇之前建议大家去看看前面两篇文章&#xff1a; 1.Ajax基本案例详解之$.ajax的实现 2.Ajax基本案例详解之$.get的实现 现在来看一下具体的内容&#xff0c;在index.jsp的<script>里面写&#xff1a; $.ajax({url:"…

ASP.NET Core服务器综述

ASP.NET Core应用通过一个进程内的HTTP服务器实例实现运行&#xff0c;这个服务器实例侦听HTTP请求并将请求作为组成HttpContext的一组请求功能集暴露给我们的应用程序。 ASP.NET Core搭载两个服务器实现&#xff1a; Kestrel是一个基于libuv的跨平台HTTP服务器&#xff0c;lib…

多环境切换---SpringBoot

多环境切换 优先级由高到底&#xff0c;高优先级的配置会覆盖低优先级的配置&#xff1b; profile是Spring对不同环境提供不同配置功能的支持&#xff0c;可以通过激活不同的环境版本&#xff0c;实现快速切换环境&#xff1b; [外链图片转存失败,源站可能有防盗链机制,建议…

Java.io.File.getPath()方法实例

转载自 Java.io.File.getPath()方法实例 java.io.File.getPath() 方法将抽象路径名到路径名字符串。为了分离名称的序列所产生的字符串使用默认名称分隔符。 声明 以下是java.io.File.getPath()方法的声明&#xff1a; public String getPath() String getPath() 参数 NA …

linux中usb设备名,Linux 中识别 USB 设备名字的 4 种方法

摘要&#xff1a; 对于初学者来说&#xff0c;在 Linux 系统里你必须掌握的技术之一就是识别出插入系统里的各种设备。这也许是你的系统硬盘、外部的存储设备或者是可移动设备&#xff0c;比如 USB 设备或 SD 闪存卡等。 现如今&#xff0c;使用 USB 设备来传输文件是十分常见的…

作为 IT 行业的过来人,你有什么话想对后辈说的?

程序员转型 作为 IT 行业的过来人&#xff0c;你有什么话想对后辈说的&#xff1f; - 圆胖肿的回答 - 知乎 https://www.zhihu.com/question/312019918/answer/1246349365 圆胖肿 程序猿 1,644 人赞同了该回答 给资本家做工具人不靠谱&#xff0c;迟早被卷 如果你是男…

探究Java File类中list()、listFiles()的使用及区别,认识和使用匿名内部类

转载自 探究Java File类中list()、listFiles()的使用及区别&#xff0c;认识和使用匿名内部类 内容概要&#xff1a; 1、认识File类&#xff1b; 2、File的构造函数&#xff1b; 3、list()及其重载方法的使用&#xff0c;匿名内部类的两种使用方式&#xff1b; 4、list…

自动配置原理---SpringBoot

自动配置原理 配置文件到底能写什么&#xff1f;怎么写&#xff1f; SpringBoot官方文档中有大量的配置&#xff0c;我们无法全部记住 分析自动配置原理 我们以**HttpEncodingAutoConfiguration&#xff08;Http编码自动配置&#xff09;**为例解释自动配置原理&#xff1b;…

Docker 部署dotnetcore

安装docker 系统还是之前centos 7.1 https://www.docker.com/products/docker#/linux yum update 创建源: /etc/yum.repos.d/docker.repo tee /etc/yum.repos.d/docker.repo <<-EOF [dockerrepo] nameDocker Repository baseurlhttps://yum.dockerproject.org/repo/main/…

Ajax基本案例详解之$.getjson的实现

Ajax的$.gethson实现&#xff1a; 看这篇之前建议大家去看看前面两篇文章&#xff1a; 1.Ajax基本案例详解之$.ajax的实现 2.Ajax基本案例详解之$.get的实现 现在写一下$.getjson里面的主要内容&#xff1a; $.getJSON("doindex.jsp",{email:$("#email&q…

Python基础案例(一)

早就有耳闻Python是多么多么的强大了&#xff0c;满怀一颗好奇心去研究研究&#xff0c;初学几天&#xff0c;果然不出所料&#xff0c;Python很强大&#xff0c;相对java,C# 等来说也比较简单&#xff0c;于是在学习中做了点总结&#xff0c;欢迎评论区留言&#xff0c;互相交…

虚拟机安装windows ghost版本系统记录完整过程

重点 1.磁盘一定要分成2个 2.直接安装第一个盘 就是进入CD后选1 自动安装 https://blog.csdn.net/hanzl1/article/details/79298787 虚拟机安装windows ghost版本系统记录完整过程 NO如果 2018-02-09 15:26:08 15193 收藏 5 分类专栏&#xff1a; windows 虚拟机 版权 …

linux下kill指令默认信号,Linux基础命令之kill命令

相信大家在使用Linux的过程中都会遇到过某个程序出错导致系统锁死的情况&#xff0c;按照常规的思维我们会通过重启来重新启动系统。然而事实上在Linux中并不需要进行重启就能够完成出错程序的关闭操作。在Linux中我们可以通过使用"kill"命令来强制终结它。那么到底它…

java中File类的getPath(),getAbsolutePath(),getCanonicalPath()区别

转载自 java中File类的getPath(),getAbsolutePath(),getCanonicalPath()区别 今天看一个例子&#xff0c;里面用到File类的getCanonicalPath()方法&#xff0c;忽然忘记这个方法返回的是什么样的路径了&#xff0c;跟getPath()和getAbsolutePath()有什么区别&#xff1f;带着这…

Supervisor 守护 dotnetcore 程序

环境准备 1.设置nginx 服务开机启动 systemctl enable nginx.servic 2.安装Supervisor yum install python-setuptools easy_install supervisor 3.配置Supervisor mkdir /etc/supervisorecho_supervisord_conf > /etc/supervisor/supervisord.conf#指定配置文件supervisord…