Làm cách nào để máy chủ web kestrel lắng nghe các yêu cầu không phải localhost?


82

Tôi đã triển khai ứng dụng c #, asp.net 5, mvc 6 cho máy chủ windows 2008. Tôi đã khởi động dnx webvà nó đang nghe cổng 5000 và hoạt động tốt khi truy cập từ máy tính cục bộ.

Làm cách nào để làm cho nó nghe các yêu cầu không phải máy chủ cục bộ?

PS Câu hỏi này không phải là một bản sao của điều này ... nó đề cập đến asp.net trước RC1 khi hosting.ini thực sự có định dạng .ini. Bây giờ, đó là JSON và tôi không thể tìm thấy bất kỳ tài liệu nào về những gì thực sự nên có trong đó.

PPS Giải pháp thực sự nằm ở câu trả lời không được chấp nhận cho câu hỏi được liên kết, với một cảnh báo lớn. Các bước:

  1. Thay đổi project.json của bạn theo câu trả lời được liên kết.
  2. Xuất bản dự án của bạn lên máy chủ của bạn.
  3. Trên máy chủ, đi tới ... \ Approot \ src \ thư mục YourProject và mở cửa sổ lệnh ở đó.
  4. Chạy dnx web- nó sẽ thất bại
  5. Chạy dnu restore
  6. Chạy 'dnu build'
  7. Chạy 'dnx web` - máy chủ web bây giờ sẽ khởi động tốt

PS Đối với những người ủng hộ câu hỏi này. Nó đã lỗi thời. Rất lỗi thời!

Nó được áp dụng cho các phiên bản đầu tiên của .NET Core. Câu hỏi và câu trả lời chắc chắn không áp dụng cho các phiên bản hiện tại của khung (ví dụ: 2.x, 3.x)



Câu trả lời thứ hai trong câu hỏi được liên kết đề cập đến định dạng JSON. Nó cũng không hữu ích cho bạn?
chue x

@chuex Tôi đã thử điều đó và ban đầu nó đã làm hỏng máy chủ web khi khởi động. Không chắc chắn lý do tại sao. Sau đó, tôi đã làm dnu restore, tiếp theo dnu buildvà sau đó dnx webkhởi động máy chủ web đúng cách. Tôi không biết tại sao nó lại xảy ra, nhưng ít nhất tôi có thể làm cho nó hoạt động. Chắc chắn có một lỗi cần được giải quyết trước khi phát hành cuối cùng. Hiện tại, đây là cách giải quyết.
AngryHacker

1
Tôi đã chỉnh sửa theo câu hỏi để phản ánh giải pháp.
AngryHacker

@AngryHacker: Bạn có thể chỉ định server.urlstham số trong tệp cấu hình ứng dụng hoặc tham số dòng lệnh. Giá trị có thể có nhiều giá trị được phân tách bằng dấu chấm phẩy xem tại đây . Tên tệp của cấu hình có thể là hosting.json , nhưng nó có thể không chỉ là json: hãy xem vấn đề . --configcó thể được sử dụng để chỉ định tên tệp cấu hình
Oleg

Câu trả lời:


114

Tệp cấu hình mặc định được sử dụng bởi máy chủ Kestrel là hosting.json. Tên đã được thay đổi nhiều lần trong các phiên bản beta khác nhau. Nếu bạn sử dụng hiện nay project.jsonnhư sau "command"phần

"commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
}

sau đó trong khi khởi động máy chủ từ dòng lệnh bằng cách

dnx web

tập tin hosting.jsonsẽ được đọc. Tập tin

{
    "server.urls": "http://0.0.0.0:5000"
}

sẽ cấu hình máy chủ để lắng nghe 5000 trên mọi địa chỉ IP4. Cấu hình

{
    "server.urls": "http://::5000;http://0.0.0.0:5000"
}

sẽ thông báo để lắng nghe 5000 trên cả địa chỉ IP4 và IP6.

Người ta có thể chỉ định các tệp cấu hình thay thế bằng ASPNET_ENVbiến môi trường sử dụng hoặc bằng cách sử dụng --config myconfig1.json(hoặc config=myconfig1.json). Ví dụ bạn có thể sử dụng

SET ASPNET_ENV=Development

và để tạo hosting.Development.jsontệp với cấu hình cụ thể. Ngoài ra, bạn có thể sử dụng project.jsonvới

"commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
    "webProd": "Microsoft.AspNet.Server.Kestrel --config prod.json"
}

và khởi động máy chủ bằng cách sử dụng

dnx webProd

Tôi phải nhắc thêm rằng bạn có thể phải cho phép nghe thêm và đăng ký (để bắt đầu dnx web). Nó được yêu cầu vì tường lửa và bảo mật cục bộ để lắng nghe các cổng TCP / HTTP mới. Một cái gì đó giống như bên dưới sẽ thực hiện đăng ký cục bộ và lắng nghe 5000 cổng cho mọi người (IPv4 và IPv6):

netsh http add iplisten ipaddress=0.0.0.0:5000
netsh http add iplisten ipaddress=::5000
netsh http add urlacl url=http://+:5000/ user=\Everyone

Để an toàn hơn, bạn có thể điều chỉnh cấu hình trên để cấp các quyền tối thiểu.

CẬP NHẬT: Cảm ơn @BlaneBunderson. Người ta có thể sử dụng * thay vì địa chỉ IP (như http://*:5000) để nghe trên bất kỳ địa chỉ IP4 và IP6 nào từ bất kỳ giao diện nào. Nên cẩn thận và không sử dụng những

  • http://*:5000;http://::5000
  • http://::5000;http://*:5000
  • http://*:5000;http://0.0.0.0:5000
  • http://*:5000;http://0.0.0.0:5000

vì nó sẽ yêu cầu đăng ký địa chỉ IP6 ::hoặc địa chỉ IP4 0.0.0.0 hai lần .

Tương ứng với thông báo

Về mặt kỹ thuật, bất kỳ tên máy chủ nào không phải là "localhost" hoặc địa chỉ IPv4 hoặc IPv6 hợp lệ sẽ khiến Kestrel liên kết với tất cả các giao diện mạng.

Tôi nghĩ rằng hành vi đó có thể được thay đổi trong tương lai. Vì vậy, tôi muốn giới thiệu để chỉ sử dụng *:5000, 0.0.0.0:5000::5000tạo cho đăng ký của bất kỳ địa chỉ CNTT.

CẬP NHẬT 2: ASP.NET Core RC2 thay đổi (xem thông báo ) hành vi tải các giá trị mặc định. Người ta phải thực hiện các thay đổi trong Maintải các cài đặt từ hosting.jsonvà các tham số dòng lệnh. Dưới đây là một ví dụ về cách sử dụng

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("hosting.json", optional: true)
        .AddEnvironmentVariables(prefix: "ASPNETCORE_")
        .AddCommandLine(args)
        .Build();

    var host = new WebHostBuilder()
        .UseUrls("http://*:1000", "https://*:1234", "http://0.0.0.0:5000")
        .UseEnvironment("Development")
        .UseConfiguration(config)
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

Mã sử dụng trên ba bindings: "http://*:1000", "https://*:1234", "http://0.0.0.0:5000"theo mặc định thay vì sử dụng cổng mặc định 5000 theo mặc định (để được chính xác việc sử dụng http://localhost:5000). Cuộc gọi của .UseConfiguration(config)được thực hiện sau khi .UseUrls . Do đó, cấu hình được tải từ hosting.jsonhoặc dòng lệnh sẽ ghi đè các tùy chọn mặc định. Nếu một .SetBasePath(Directory.GetCurrentDirectory())dòng loại bỏ thì dòng hosting.jsonsẽ được tải từ cùng một thư mục nơi dll ứng dụng sẽ được biên dịch (ví dụ bin\Debug\netcoreapp1.0).

Người ta có thể sử dụng cách thực thi như

dotnet.exe run --server.urls=http://0.0.0.0:5000

để ghi đè cài đặt mặc định (từ UseUrls) và cài đặt từ thuộc "server.urls"tính hosting.jsonnếu nó tồn tại.

Theo cách tương tự, người ta có thể ghi đè cài đặt ULR bằng cách đặt biến môi trường

set ASPNETCORE_SERVER.URLS=http://localhost:12541/

thì phần khởi động mặc định của ứng dụng đang sử dụng dotnet.exe runsẽ dùng http://localhost:12541/để ràng buộc.

Bạn có thể tìm thấy ở đây một ví dụ về việc sử dụng liên kết HTTPS.

Ghi chú: Tên của biến môi trường được thay đổi từ ASPNETCORE_SERVER.URLSđến ASPNETCORE_URLStrong các phiên bản sau này của ASP.NET (xem ở đây tài liệu của ASP.NET Lõi 3.1).


1
Ngoài ra, bạn có thể sử dụng "server.urls": "http: // *: 5000" thay vì "server.urls": " 0.0.0.0:5000 " (Cá nhân tôi nghĩ dấu * có ý nghĩa hơn một chút.)
Blane Bunderson 13/12/15

@BlaneBunderson: Cảm ơn đề xuất của bạn! Tôi phải thêm rằng http://*:5000giống như http://::5000;http://0.0.0.0:5000và không http://0.0.0.0:5000. Nó buộc phải lắng nghe cả IPv4 và IPv6. Bạn có thể xác minh nó bằng cách sử dụng http://*:5000;http://::5000hoặc http://::5000;http://*:5000. Người ta gặp lỗi "Microsoft.AspNet.Server.Kestrel.Networking.UvException: Lỗi -4091 địa chỉ EADDRINUSE đã được sử dụng" trong khi đăng ký địa chỉ thứ hai. Trong một số trường hợp, đăng ký cả IPv4 và IPv6 là tốt, trong các trường hợp khác thì không tốt. Nói theo cách nào thì cũng tốt thôi.
Oleg

Bản cập nhật tuyệt vời cho RC2, cảm ơn vì lời giải thích chi tiết
Trygve

sẽ không .UseStartup<Startup>()ghi đè .UseConfiguration(config)trong ví dụ "cập nhật 2" của bạn?
nicks

có lỗi đánh máy trong biến môi trường đó, nó phải là ASPNETCORE_URLS
nrjohnstone

33

Trong RC2, phần lệnh của project.json không còn được sử dụng nữa. Tôi chưa yêu cầu Kestrel tải hosting.json, nhưng bạn có thể lập trình cổng trong Main của ứng dụng nơi WebHostBuilder mới được tạo và định cấu hình. Chỉ cần thêm phương thức .UseUrls () như trong ví dụ bên dưới

    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseUrls("http://0.0.0.0:5000/")
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }

3
Đây là một trợ giúp lớn. .UseUrls("http://*:5000")Thay vào đó, tôi đã sử dụng và chuyển tiếp cổng 5000 với IP máy chủ trống trên VirtualBox và cuối cùng tôi có thể truy cập điểm cuối .NET Core được lưu trữ trên Docker từ máy Mac của mình. Ngọt!
Mark Larter vào

Để biết thông tin về cách sử dụng hosting.json trong RC2 và giải thích chi tiết hơn, hãy đọc câu trả lời của Oleg ở trên, đặc biệt là "Đã cập nhật 2"
Trygve

2
Cũng áp dụng cho 1.0.0-preview2-003121, hình ảnh
docker

18

Nếu bạn sử dụng asp.net core 2.1 +, hãy sửa đổi phần cấu hình trong appsettings.json.

"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://0.0.0.0:5002"
    }
  }
},

Điều này cũng đã liên tục hoạt động cho tôi khi chạy từ VS Code hoặc Visual Studio cho Mac. ASPNETCORE_URLSkhông làm việc cho tôi
JSancho

10

Nếu bạn đang cố gắng đặt một ứng dụng ASP.NET Core bên trong một bộ chứa docker (trường hợp sử dụng của tôi khi cần lắng nghe các địa chỉ không phải localhost), hãy lưu ý rằng trường hợp sử dụng này đã được Microsoft tập hợp lại cho bạn. Bạn có thể xem toàn bộ vinh quang tại https://hub.docker.com/r/microsoft/aspnetcore/

Hiện tại (v1.0.1), điều kỳ diệu quan trọng để giải quyết vấn đề này là Dockerfile nguồn chứa cài đặt biến môi trường url và ứng dụng không cố gắng ghi đè điều này. (Thật vậy, một ứng dụng được chứa trong nội bộ phải khẳng định càng ít càng tốt về môi trường nơi nó sẽ chạy.)

ENV ASPNETCORE_URLS http://+:80

Lưu ý dấu cộng hơn là dấu hoa thị ở đó. Tôi thực sự khuyên bạn nên truy cập liên kết dockerhub ở trên để đọc câu trả lời của tôi miễn là liên kết tốt. Phiên bản 1.1 sắp ra mắt và mọi thứ có thể thay đổi một lần nữa trong tương lai.

Khi chạy vùng chứa, hãy đảm bảo để lộ cổng khách 80, theo cài đặt biến môi trường. Ví dụ:

docker run -d -p 8000:80 myapp
curl localhost:8000

1
đây cũng là trường hợp sử dụng của tôi và liên kết cực kỳ hữu ích. Cảm ơn bạn.
Oxymoron

3

Đối với AspNetCore 3.1+, chỉ cần thêm dòng sau vào tệp appsettings.json:

"Urls": "http://*:80"

1
Hoạt động như một sự quyến rũ. Tôi không thể tìm thấy tại sao các giải pháp với hosting.jsonsẽ không hoạt động tho.
Machado

0

Đặt biến môi trường ASPNETCORE_URLSthành http://0.0.0.0:5000/.

Nếu chạy từ Visual Studio, bạn thêm biến môi trường từ tab Gỡ lỗi của thuộc tính dự án.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.