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

阳光穿透心脏的1/2处 2021-11-19 13:06 244阅读 0赞

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

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

被框架所管制,那如何实现默认端口的修改呢?

骨架代码:

复制代码

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateWebHostBuilder(args).Build().Run();
  6. }
  7. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  8. WebHost.CreateDefaultBuilder(args)
  9. .UseStartup<Startup>();
  10. }

复制代码

发布如下:

214741-20180831152256205-2085692813.jpg

一:解决办法1(UseUrls)

  1. 骨架代码就那么几行,很容易在这个IWebHostBuilder中找到一个叫做UseUrls的方法,从注解中可以看得出来让WebHost监听指定的端口号,截图如下:

214741-20180901064436773-1315900290.png

那么答案就出来了,你需要自己来指定一下端口,改完之后截图如下:

复制代码

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateWebHostBuilder(args).Build().Run();
  6. }
  7. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  8. WebHost.CreateDefaultBuilder(args)
  9. .UseUrls("http://*:8080")
  10. .UseStartup<Startup>();
  11. }

复制代码

214741-20180901065119810-1986265996.png

但是在发布之后,你突然发现,卧槽,端口冲突了,我想换端口,tmd我还得为此再发一次程序,一个字麻烦,说一送一。差点被砍到的第一反应就是把硬编码

送到配置文件中。

二:解决办法2 (host.json)

  1. 你会突然发现要使用到的Configuration属性只能在Startup类中,毕竟在WebHostBuild之前ServiceCollection都没有初始化,哪里有统一化的配置系统呢,

那怎么办,还能怎么办,自己定义一个Configuration了,然后修改的步骤如下:

  1. 新增一个host.json,名字随便定义,自己看得懂就行啦。

    {

    1. "url": "http://*:9099"

    }

214741-20180901071251718-1929367097.png

  1. webhost代码修改

复制代码

  1. public static IWebHostBuilder CreateWebHostBuilder(string[] args)
  2. {
  3. var configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
  4. .AddJsonFile("host.json")
  5. .Build();
  6. var url = configuration["url"];
  7. return WebHost.CreateDefaultBuilder(args).UseUrls(configuration["url"])
  8. .UseStartup<Startup>();
  9. }

复制代码

214741-20180901082944024-1073887446.png

  1. 问题倒是解决了,但是总发现有一点不爽,突然新来的Configration就好像半路杀出的陈咬金,所以说如果将陈咬金收编过来就完美了。

三:不够优雅后的整合

  1. 接下来你很容易会在WebHostBuilder中发现另一个方法UseConfiguration,看参数就是用来接收ConfigurationRoot的,所以就把代码修改如下:

复制代码

  1. public static IWebHostBuilder CreateWebHostBuilder(string[] args)
  2. {
  3. var configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
  4. .AddJsonFile("host.json")
  5. .Build();
  6. //var url = configuration["url"];
  7. return WebHost.CreateDefaultBuilder(args).UseConfiguration(configuration)
  8. .UseStartup<Startup>();
  9. }

复制代码

  1. 但是这里有一个问题,asp.netcore能识别我自定义的url吗?肯定是不能识别的啦,那问题就是,AspnetCore模式会用哪一个key作为url的地址呢??

要找到答案的话得需要从源码上啦,从UseUrls入手吧。

214741-20180901072332321-285398856.png

从上面可以看到,UseUrls默认是使用 WebHostDefaults.ServerUrlsKey 作为url的key的,然后继续F12看一下它的 内容是什么?

214741-20180901072452909-66837741.png

好了,真想大白了,原来是urls,接下来我只需要把host.json 的url改成urls就可以了,对吧。

  1. {
  2. "urls": "http://*:9099"
  3. }

214741-20180901072646207-662516955.png

四:解决办法3 (使用docker)

  1. 如果你不想做出任何改变,不想做任何退步,那没办法,只能把你关进docker里啦。
  1. dockerfile

复制代码

  1. FROM microsoft/dotnet:2.1-aspnetcore-runtime
  2. MAINTAINER hxc@qq.com
  3. RUN mkdir /data
  4. COPY ./publish/ /data
  5. WORKDIR /data
  6. CMD [ "dotnet","WebApplication1.dll" ]

复制代码

  1. publish 文件夹

    在dockerfile的同级目录下,新建一个publish文件夹用来存放当前dll文件。

214741-20180901081549882-732940103.png

  1. 通过build从dockerfile中构建镜像

复制代码

  1. [root@localhost tsweb]# docker build --rm -f ts.dockerfile -t a/netcore:v1 .
  2. Sending build context to Docker daemon 2.56 kB
  3. Step 1/6 : FROM microsoft/dotnet:2.1-sdk
  4. ---> bde01d9ed6eb
  5. Step 2/6 : MAINTAINER hxc@qq.com
  6. ---> Using cache
  7. ---> 3af0c3f7c416
  8. Step 3/6 : RUN mkdir /data
  9. ---> Using cache
  10. ---> 97137ffc5449
  11. Step 4/6 : COPY ./publish/ /data
  12. ---> Using cache
  13. ---> 77a94f1a0b8f
  14. Step 5/6 : WORKDIR /data
  15. ---> Using cache
  16. ---> 6778c2054a7b
  17. Step 6/6 : CMD dotnet WebApplication1.dll
  18. ---> Running in e4a69b32e702
  19. ---> 9ed3a9769610
  20. Removing intermediate container e4a69b32e702
  21. Successfully built 9ed3a9769610

复制代码

  1. 最后启动镜像,用8888绑定到默认的5000端口

    [root@localhost tsweb]# docker run -d -p 8888:5000 —name a-webcore-v1 a/netcore:v1
    f94c727b98d5654aa560308752c2af7cde550b6cc06c520bd438e4ccf1fa616d

  1. 然后你清楚的看到8888端口已经打开了,但是却不能访问,尴尬。。。

复制代码

  1. [root@localhost tsweb]# netstat -tlnp
  2. Active Internet connections (only servers)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1834/dnsmasq
  5. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1135/sshd
  6. tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1136/cupsd
  7. tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1582/master
  8. tcp6 0 0 :::3306 :::* LISTEN 2451/mysqld
  9. tcp6 0 0 :::22 :::* LISTEN 1135/sshd
  10. tcp6 0 0 ::1:631 :::* LISTEN 1136/cupsd
  11. tcp6 0 0 :::8888 :::* LISTEN 9531/docker-proxy-c
  12. tcp6 0 0 ::1:25 :::* LISTEN 1582/master
  13. [root@localhost tsweb]#

复制代码

214741-20180901081905182-1530440610.png

  1. 解决这个问题的第一步就要看一下 容器中真的开放出来了5000端口吗,可通过docker logs 或 docker ps 查看

    [root@localhost tsweb]# docker logs b-webcore-v1
    Hosting environment: Production
    Content root path: /data
    Now listening on: http://[::]:80
    Application started. Press Ctrl+C to shut down.
    [root@localhost tsweb]#

  1. 原来开放的是80端口哈~~~~ 那就简单了,把原来的容器给删了,重新生成一个容器再映射一下就好啦。
  2. [root@localhost tsweb]# docker rm -f b-webcore-v1
  3. b-webcore-v1
  4. [root@localhost tsweb]# docker run -d -p 8888:80 --name b-webcore-v1 b/netcore:v1
  5. e58039e02740e37cc431c1176fbf586ab19b02bd9331040e4719e9d46e51627d
  6. [root@localhost tsweb]#

214741-20180901082308987-1173905069.png

终于解决了,好了,本篇就说到这里,希望对你有帮助。

转载于:https://www.cnblogs.com/LiZhongZhongY/p/10869316.html

发表评论

表情:
评论列表 (有 0 条评论,244人围观)

还没有评论,来说两句吧...

相关阅读

    相关 异步编程方式,知道?

    异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间。 比如:`「发送短信、邮件、异步更新等」`,这些都