你須要知道的這幾種 asp.net core 修改默認端口的方式

 

  通常狀況下,aspnetcore發佈後的默認端口是5000,這個你們都知道,並且默認骨架代碼中沒有看到任何讓你輸入的ip地址和端口號,但做爲程序員的咱們,不但願mysql

被框架所管制,那如何實現默認端口的修改呢?程序員

 

骨架代碼:web

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }

 

發佈以下:sql

 

一:解決辦法1(UseUrls)docker

       骨架代碼就那麼幾行,很容易在這個IWebHostBuilder中找到一個叫作UseUrls的方法,從註解中能夠看得出來讓WebHost監聽指定的端口號,截圖以下:json

 

那麼答案就出來了,你須要本身來指定一下端口,改完以後截圖以下:框架

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                 .UseUrls("http://*:8080")
                .UseStartup<Startup>();
    }

 

 可是在發佈以後,你忽然發現,臥槽,端口衝突了,我想換端口,tmd我還得爲此再發一次程序,一個字麻煩,說一送一。差點被砍到的第一反應就是把硬編碼asp.net

送到配置文件中。ssh

 

二:解決辦法2 (host.json)tcp

       你會忽然發現要使用到的Configuration屬性只能在Startup類中,畢竟在WebHost的Build以前ServiceCollection都沒有初始化,哪裏有統一化的配置系統呢,

 那怎麼辦,還能怎麼辦,本身定義一個Configuration了,而後修改的步驟以下:

 

1. 新增一個host.json,名字隨便定義,本身看得懂就行啦。

{
    "url": "http://*:9099"
}

 

2. webhost代碼修改

 

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            var configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
                                          .AddJsonFile("host.json")
                                          .Build();

            var url = configuration["url"];

            return WebHost.CreateDefaultBuilder(args).UseUrls(configuration["url"])
                                                     .UseStartup<Startup>();
        }

   

      問題卻是解決了,可是總髮現有一點不爽,忽然新來的Configration就好像半路殺出的陳咬金,因此說若是將陳咬金收編過來就完美了。

 

三:不夠優雅後的整合

      接下來你很容易會在WebHostBuilder中發現另外一個方法UseConfiguration,看參數就是用來接收ConfigurationRoot的,因此就把代碼修改以下:

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            var configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
                                          .AddJsonFile("host.json")
                                          .Build();

            //var url = configuration["url"];

            return WebHost.CreateDefaultBuilder(args).UseConfiguration(configuration)
                                                     .UseStartup<Startup>();
        }

 

        可是這裏有一個問題,asp.netcore能識別我自定義的url嗎?確定是不能識別的啦,那問題就是,AspnetCore模式會用哪個key做爲url的地址呢??

要找到答案的話得須要從源碼上啦,從UseUrls入手吧。

 

從上面能夠看到,UseUrls默認是使用 WebHostDefaults.ServerUrlsKey 做爲url的key的,而後繼續F12看一下它的 內容是什麼?

 

 

   好了,真想大白了,原來是urls,接下來我只須要把host.json 的url改爲urls就能夠了,對吧。

 

{
    "urls": "http://*:9099"
}

 

四:解決辦法3 (使用docker)

      若是你不想作出任何改變,不想作任何退步,那沒辦法,只能把你關進docker裏啦。

 

1. dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime

MAINTAINER hxc@qq.com

RUN mkdir /data

COPY ./publish/ /data

WORKDIR /data

CMD [ "dotnet","WebApplication1.dll" ]

 

2. publish 文件夾

   在dockerfile的同級目錄下,新建一個publish文件夾用來存放當前dll文件。

 

3. 經過build從dockerfile中構建鏡像

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

 

4. 最後啓動鏡像,用8888綁定到默認的5000端口

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

 

5. 而後你清楚的看到8888端口已經打開了,可是卻不能訪問,尷尬。。。

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

 

6. 解決這個問題的第一步就要看一下 容器中真的開放出來了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]# 

 

    原來開放的是80端口哈~~~~  那就簡單了,把原來的容器給刪了,從新生成一個容器再映射一下就好啦。

 

[root@localhost tsweb]# docker rm -f b-webcore-v1
b-webcore-v1
[root@localhost tsweb]# docker run -d -p 8888:80 --name b-webcore-v1 b/netcore:v1
e58039e02740e37cc431c1176fbf586ab19b02bd9331040e4719e9d46e51627d
[root@localhost tsweb]# 

   

 

  終於解決了,好了,本篇就說到這裏,但願對你有幫助。

相關文章
相關標籤/搜索