前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Do you kown Asp.Net Core -- 配置Kestrel端口

Do you kown Asp.Net Core -- 配置Kestrel端口

作者头像
脑洞的蜂蜜
发布2018-02-01 17:34:38
1.9K0
发布2018-02-01 17:34:38
举报
文章被收录于专栏:NetCoreNetCore

Kestrel介绍

Asp.Net Core中,我们的web application 其实是运行在Kestrel服务上,它是一个基于libuv开源的跨平台可运行 Asp.Net Core 的web服务器。

在开发阶段,我们可以直接使用Kestrel服务器用来测试,也可以使用IISExpress。在使用IISExpress其实也需要启动一个Kestrel服务器,通过IISExpress反向代理请求到Kestrel,很多时候我更喜欢使用Kestrel,因为可以实时看到log。

配置端口

在Socket开发中,服务器都会绑定到某个ip某个端口进行监听,等待客户端的连接,然后交换数据,Kestrel同样需要对某个端口进行监听,客户端会请求这个端口然后建立连接进行数据交换。我们说的配置url或者配置端口,其实本质上都是建立对某个端口的监听。

配置规则

我们知道在Kestrel通过绑定Urls参数实现绑定ip和端口,.Net Core允许我们使用多种方式来实现绑定url,我们先了解下绑定的规则:

[http|https]://[ip|localhost|hostname]:port

  1. localhost 或127.0.0.1 代表本机ip,仅允许本机访问
  2. 局域网ip,允许局域网内客户端访问
  3. 端口0代表随机绑定可用端口
  4. '*' 代表0.0.0.0,允许本机、局域网、公网访问

'*'不是特殊字符,任何不能识别成ip的字符都将会绑定到0.0.0.0,so,你看到的hostname:ip 其实并没有真正的绑定到hostname,Kestrel不会识别hostname,所以不允许像iis那样,多个application通过hostname绑定到同一个ip的同一个端口上,所以你需要通过反向代理服务器来实现

通过上述的绑定字符串,Kestrel会解析成相应的ip和端口,然后进行绑定监听。

配置方式

.Net Core提供了多种对Kestrel端口的配置方式,我们可以通过编码、配置文件、命令行参数进行配置,非常便利,接下来我们来看下各种配置方式。

无论那种方式,我们都必须在Kestrel启动之前进行,一般情况我们都在Program.cs中进行。

编码方式

编码方式有2种方式: 1、通过UseKestrel(Action):

代码语言:javascript
复制
var host = WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .UseKestrel(o =>
    {
        o.Listen(IPAddress.Loopback, 5001);
    })
    .Build();

host.Run();

o.Listen(IPAddress.Loopback, 5004) 就是进行绑定,其中第一个参数是IPAddress类型。这种方式不是很便利,阅读性也不好,推荐使用第二种 2、通过UseUrls方式:

代码语言:javascript
复制
var host = WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .UseUrls("http://localhost:5002;http://localhost:5003")
    .Build();

host.Run();

这种方式相对简单,而且不容易出错,但灵活性不强。

通过配置文件

我们可以通过Json文件对Kestrel进行配置,包括我们的url。 1、首先我们需要创建一个json文件,这里以host.json为例:

代码语言:javascript
复制
{
  "urls": "http://*:5004;"
}

2、我们需要在build host的时候告诉Kestrel读取config文件,代码如下:

代码语言:javascript
复制
public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("host.json", optional: true)
    .Build();

    var host = WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseConfiguration(config)
        .Build();

    host.Run();
}

这种方式相比编码来说较便利,但如果在web运行在容器内的话,修改还是有点麻烦,下面来看下命令行格式。

命令行方式

我们知道.net core我们可以使用dotnet 命令方式去运行 .net core 应用,这种方式使我们的web不再依赖于iis,实现了跨平台。 我们先了解下命令:

代码语言:javascript
复制
> dotnet run [options] [[--] arguments]

dotnet run 命令会把我们的项目编译后直接运行,在开发的时候使用,如果是编译好的项目,则使用:

代码语言:javascript
复制
> dotnet yourproject.dll [[--] arguments]

如果我们需要配置Urls的话,则只要使用参数--urls="http://*:5005",例如:

代码语言:javascript
复制
> dotnet run --urls="http://*:5005"

如果这时候你如此运行,你会发现你的项目并未监听5005端口,因为你还没有对Kestrel进行配置,告诉其读取命令行参数,我们需要在Build host的时候进行如下配置:

代码语言:javascript
复制
public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddCommandLine(args)   //添加对命令参数的支持
    .Build();

    var host = WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

ok,这时候再运行dotnet run命令吧!

关于url配置的问题

Q:url配置支持多域名吗? A:上面说过,kestrel是不支持主机名解析的,你进行的配置都会绑定到0.0.0.0

Q:url配置支持多个ip吗? A:支持,但必须是本机所属ip,否则运行则出错

Q:多个Kestrel能监听一个端口吗? A:不能

Q:我能通过多种方式进行url配置吗? A:可以,但最终生效的只有一种,也就是最后配置的方式,没有优先级

Q:Kestrel支持https吗? A:支持

Q:为什么其他教程中是使用servers.urls呢? A:我看了下,可能是扩展类的不同吧,目前来说已经改成urls了,而且不需要再额外引用其他类库了

代更。。。。。。

写在最后

最近在看微服务和asp.net core的东西,也希望把一些小知识分享给大家。 最后推荐我的.Net Core QQ学习群:376248054(通关密码:cnblogs),最近群里不是很活跃,大家进来多发言发言哈~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Kestrel介绍
  • 配置端口
    • 配置规则
    • 配置方式
      • 编码方式
        • 通过配置文件
          • 命令行方式
            • 关于url配置的问题
            • 写在最后
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档