전송 : HTTPS : //www.cnblogs.com/huangxincheng/p/9569133.html
정상적인 상황에서는 aspnetcore 출시 후 기본 포트는 5000이 우리 모두가 알고, 기본 골격 코드가 입력하는 모든하자의 IP 주소와 포트 번호가 표시되지 않지만, 프로그래머로서 우리는 원하지 않는다
규제 프레임 워크는 어떻게 기본 포트를 변경하는 것입니다?
해골 코드 :
공용 클래스 프로그램 { 공공 정적 무효 메인 (문자열 []에 args) { CreateWebHostBuilder (인수) .Build () 실행 ().; } 공공 정적 IWebHostBuilder CreateWebHostBuilder (문자열 [] 인수) => WebHost.CreateDefaultBuilder (인수) .UseStartup <시작> (); }
다음과 같이 게시 :
A : 해결 방법 1 (UseUrls)
해골 코드 그래서 몇 줄, 그것은이 IWebHostBuilder에서 UseUrls라는 방법을 쉽게 찾을 수, 주석이 포트 번호를 지정한 다음 스크린 샷을 듣고 만든다 웹 호스트에서 볼 수있다 :
그런 답이 나온 다음과 같이 그 장면이 무엇인지 포트 후 지정해야합니다 :
공용 클래스 프로그램 { 공공 정적 무효 메인 (문자열 []에 args) { CreateWebHostBuilder (인수) .Build () 실행 ().; } 공공 정적 IWebHostBuilder CreateWebHostBuilder (문자열 [] 인수) => WebHost.CreateDefaultBuilder (인수) .UseUrls ( "HTTP : // * 8080") .UseStartup <시작> (); }
그러나 출시 후, 갑자기 그 FML, 포트 충돌을 발견하고 내가 포트, TMD를 변경하려면 내가 Zaifayici 프로그램, 워드 문제에 한 번 무료로 하나를 얻을 말한다. 제 반응 거의 잘라 하드 코딩
구성 파일에.
II : 해결 방법 2 (host.json)
당신이 갑자기 초기화되지 않은 경우에만 시작 구성 클래스의 속성을 사용하려는, 결국, ServiceCollection 전에 웹 호스트를 구축 발견 할 것이다, 어디서 통합 구성 시스템,
수행하는 방법뿐만 아니라, 어떻게 구성의 자신의 정의를 위해, 다음과 같이 다음 단계를 수정 :
host.json 추가 1. 이름은 부담 자체는 줄에 읽을 수있는 정의합니다.
{ "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 [email protected] 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 [email protected] ---> 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) 하는 ~ ~ ~ ~ 그것은 간단하고, 원래의 용기는 삭제하고, 그 다음 무엇을 Jiuhaola 컨테이너의 매핑을 다시 생성합니다.
[루트 @의 로컬 호스트 Tsweb입니다] # 고정 표시기는 rm -f의 B-webcore-V1 B-webcore-V1 [루트 @의 로컬 호스트 Tsweb입니다] # 고정 표시기 실행 -d -p 8888 : V1 : B-webcore-V1의 B / netcore 80 --name e58039e02740e37cc431c1176fbf586ab19b02bd9331040e4719e9d46e51627d [루트 @ 로컬 호스트의 Tsweb입니다] #
마지막으로 좋은 여기에 해결이 우리가 당신을 도울 수 있도록 노력하겠습니다, 여기 중지합니다.