Jak sprawić, aby serwer WWW Kestrel nasłuchiwał żądań innych niż localhost?

82

Wdrożyłem moją aplikację w języku C #, asp.net 5, mvc 6 na serwerze z systemem Windows 2008. Odpaliłem dnx webi nasłuchuje portu 5000 i działa dobrze podczas uzyskiwania dostępu z lokalnego komputera.

Jak mogę nasłuchiwać żądań innych niż localhost?

PS To pytanie nie jest duplikatem tego ... odnosi się do asp.net w wersji wcześniejszej niż RC1, podczas gdy hosting.ini w rzeczywistości miał format .ini. Teraz jest to JSON i nie mogę znaleźć żadnej dokumentacji na temat tego, co powinno w nim być.

PPS Prawdziwym rozwiązaniem jest nieakceptowana odpowiedź na powiązane pytanie, z ogromnym zastrzeżeniem. Kroki:

  1. Zmień plik project.json zgodnie z połączoną odpowiedzią.
  2. Opublikuj swój projekt na swoim serwerze.
  3. Na serwerze przejdź do folderu ... \ Approot \ src \ YourProject i otwórz tam okno poleceń.
  4. Uruchom dnx web- to się nie powiedzie
  5. Biegać dnu restore
  6. Uruchom „dnu build”
  7. Uruchom „dnx web” - serwer WWW powinien teraz zacząć działać poprawnie

PS Dla osób zagłosujących za tym pytaniem. Jest przestarzały. Bardzo przestarzały!

Dotyczyło wczesnych wersji .NET Core. Pytanie i odpowiedzi z pewnością nie dotyczą obecnych wersji frameworka (np. 2.x, 3.x)

AngryHacker
źródło
Możliwy duplikat połączenia ASP.NET 5 Kestrel w sieci LAN
zmiana x
Cóż, druga odpowiedź w powiązanym pytaniu dotyczy formatu JSON. Tobie też nie jest to przydatne?
chue x
@chuex Próbowałem tego i początkowo spowodowało to awarię serwera WWW podczas uruchamiania. Nie pewny dlaczego. Potem zrobiłem dnu restore, a dnu buildnastępnie dnx webpoprawnie uruchomiłem serwer WWW. Nie wiem, dlaczego tak się dzieje, ale przynajmniej jestem w stanie sprawić, by to zadziałało. Zdecydowanie jest błąd, który należy rozwiązać przed ostatecznym wydaniem. Na razie jest to obejście.
AngryHacker,
1
Edytowałem pytaniami, aby odzwierciedlić rozwiązanie.
AngryHacker,
2
Czytałem duże litery, że jestem nieaktualny, ale absolutnie potrzebowałem odpowiedzi tutaj, nawet w przypadku internetowego interfejsu API w .NET Core 3.1. Najpierw próbowałem powiązać się z 0.0.0.0:5000, ale IPv6 najwyraźniej dzieje się tutaj, więc to nie zadziałało. W międzyczasie [::]: 5000 nie działało również przy zewnętrznym dostępie IPv4. Nie miałem pojęcia, że ​​powiązanie z *: 5000 było nawet rzeczą, ponieważ teraz wychodzimy ze standardu IPv4 / IPv6. Tak bardzo pomocne!
Jonas

Odpowiedzi:

115

Domyślny plik konfiguracyjny używany przez serwer Kestrel to hosting.json. Nazwa była wielokrotnie zmieniana w różnych wersjach beta. Jeśli używasz teraz project.jsonz następującą "command"sekcją

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

następnie podczas uruchamiania serwera z linii poleceń przez

dnx web

plik hosting.jsonzostanie odczytany. Plik

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

skonfiguruje serwer do nasłuchiwania 5000 na każdym adresie IP4. Konfiguracja

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

poinformuje o nasłuchiwaniu 5000 na adresach IP4 i IP6.

Można określić alternatywne pliki konfiguracyjne za pomocą ASPNET_ENVzmiennej środowiskowej użycia lub przez użycie --config myconfig1.json(lub config=myconfig1.json). Na przykład możesz użyć

SET ASPNET_ENV=Development

i stworzyć hosting.Development.jsonplik o określonej konfiguracji. Alternatywnie możesz użyć project.jsonz

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

i uruchom serwer przez użycie

dnx webProd

Muszę dodatkowo przypomnieć, że może być wymagane pozwolenie na dodatkowe odsłuchanie i rejestrację (na start dnx web). Jest to wymagane ze względu na zaporę ogniową i lokalne bezpieczeństwo nasłuchiwania nowych portów TCP / HTTP. Coś jak poniżej powinno spowodować lokalną rejestrację i nasłuchiwanie portu 5000 dla wszystkich (IPv4 i 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

Aby być bezpieczniejszym, możesz dostosować powyższą konfigurację, aby przyznać minimalne uprawnienia.

AKTUALIZACJA: Dzięki @BlaneBunderson. Można użyć * zamiast adresu IP (np. http://*:5000), Aby nasłuchiwać na dowolnych adresach IP4 i IP6 z dowolnego interfejsu. Należy być ostrożnym i nie używać ich

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

ponieważ będzie wymagało dwukrotnej rejestracji adresu IP6 ::lub adresu IP4 .0.0.0.0

Odpowiada ogłoszeniu

Z technicznego punktu widzenia każda nazwa hosta, która nie jest „localhost” lub prawidłowy adres IPv4 lub IPv6, spowoduje, że Kestrel będzie wiązać się ze wszystkimi interfejsami sieciowymi.

Myślę, że zachowanie można zmienić w przyszłości. Tak więc polecam tylko używać *:5000, 0.0.0.0:5000i ::5000tworzą dla rejestracji z dowolnego adresu IT.

ZAKTUALIZOWANO 2: ASP.NET Core RC2 zmienia (zobacz ogłoszenie ) zachowanie ładowania wartości domyślnych. MainAby załadować ustawienia z hosting.jsoni parametry wiersza poleceń, należy wprowadzić zmiany . Poniżej znajduje się przykład użycia

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();
}

Powyższy kod użycie trzy Wiązania: "http://*:1000", "https://*:1234", "http://0.0.0.0:5000"domyślnie zamiast wykorzystania stanu domyślnego portu 5000 domyślnie (a dokładnie użycie http://localhost:5000). Wezwanie.UseConfiguration(config) są wykonywane później .UseUrls . W ten sposób konfiguracja załadowana z hosting.jsonlub wiersz poleceń nadpisuje domyślne opcje. Jeśli usunie się jeden .SetBasePath(Directory.GetCurrentDirectory())wiersz, plik hosting.jsonzostanie załadowany z tego samego katalogu, w którym zostanie skompilowana biblioteka dll aplikacji (na przykład bin\Debug\netcoreapp1.0).

Można użyć wykonania jak

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

nadpisać ustawienia domyślne (z UseUrls) i ustawienia "server.urls"właściwości z, hosting.jsonjeśli istnieją.

W ten sam sposób można nadpisać ustawienia ULR, ustawiając zmienną środowiskową

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

wtedy domyślny start aplikacji za pomocą dotnet.exe runbędzie używany http://localhost:12541/do wiązania.

Możesz znaleźć tutaj przykład użycia wiązania HTTPS.

UWAGA: nazwa zmiennej środowiskowej jest zmieniana z ASPNETCORE_SERVER.URLSna ASPNETCORE_URLSw nowszych wersjach ASP.NET (zobacz tutaj dokumentację ASP.NET Core 3.1).

Oleg
źródło
1
Dodatkowo możesz użyć „server.urls”: „http: // *: 5000” zamiast „server.urls”: „ 0.0.0.0:5000 ” (Osobiście uważam, że * ma trochę więcej sensu).
Blane Bunderson
@BlaneBunderson: Dziękuję za sugestię! Muszę dodać, że http://*:5000to to samo, co http://::5000;http://0.0.0.0:5000i nie http://0.0.0.0:5000. Wymusza nasłuchiwanie zarówno dla IPv4, jak i IPv6. Możesz to zweryfikować za pomocą http://*:5000;http://::5000lub http://::5000;http://*:5000. Podczas rejestrowania drugiego adresu pojawia się błąd „Microsoft.AspNet.Server.Kestrel.Networking.UvException: Error -4091 EADDRINUSE adres już używany”. W niektórych scenariuszach rejestracja zarówno IPv4, jak i IPv6 jest dobra, w innych scenariuszach nie jest dobra. W każdym razie dobrze jest wspomnieć o drodze.
Oleg
Doskonała aktualizacja dla RC2, dzięki za szczegółowe wyjaśnienie
Trygve
nie .UseStartup<Startup>()nadpisałby .UseConfiguration(config)w przykładzie z „aktualizacją 2”?
nicków
w tej zmiennej środowiskowej jest literówka, powinna to być ASPNETCORE_URLS
nrjohnstone
33

W RC2 sekcja poleceń projektu.json nie jest już używana. Nie pobrałem jeszcze Kestrel do pobrania hostingu.json, ale możesz programowo ustawić port w sekcji głównej aplikacji, w której jest tworzony i konfigurowany nowy WebHostBuilder. Po prostu dodaj metodę .UseUrls () jak w przykładzie poniżej

    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();
    }
Trygve
źródło
3
To była duża pomoc. .UseUrls("http://*:5000")Zamiast tego użyłem i przekierowałem port 5000 z pustym adresem IP hosta na VirtualBox, a na koniec mogę uzyskać dostęp do punktów końcowych platformy .NET Core hostowanych przez platformę Docker z mojego komputera Mac. Słodkie!
Mark Larter
Aby uzyskać informacje na temat korzystania z hostingu.json w RC2 i bardziej szczegółowe wyjaśnienia, przeczytaj powyższą odpowiedź Olega, zwłaszcza „Zaktualizowano 2”
Trygve
2
Dotyczy również wersji 1.0.0-preview2-003121, obraz
Docker
18

Jeśli używasz asp.net core 2.1 +, zmodyfikuj sekcję konfiguracji w appsettings.json.

"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://0.0.0.0:5002"
    }
  }
},
menxin
źródło
Ten również konsekwentnie działał dla mnie podczas uruchamiania z VS Code lub Visual Studio dla komputerów Mac. ASPNETCORE_URLSnie działa dla mnie
JSancho
10

Jeśli próbujesz umieścić aplikację ASP.NET Core w kontenerze Docker (co było moim przypadkiem użycia, gdy trzeba było nasłuchiwać adresów hosta innego niż lokalny), pamiętaj, że ten przypadek użycia został już przygotowany przez firmę Microsoft. Możesz zobaczyć pełną chwałę na https://hub.docker.com/r/microsoft/aspnetcore/

W chwili obecnej (wersja 1.0.1) kluczowym elementem rozwiązania tego problemu jest to, że źródłowy plik Dockerfile zawiera ustawienie zmiennej środowiskowej adresu URL, a aplikacja nie próbuje tego przesłonić. (Rzeczywiście, aplikacja kontenerowa powinna wewnętrznie potwierdzać jak najmniej informacji o środowisku, w którym będzie działać).

ENV ASPNETCORE_URLS http://+:80

Zwróć uwagę na znak plus zamiast gwiazdki. Właściwie polecam odwiedzenie powyższego linku dockerhub, zamiast czytania mojej odpowiedzi, o ile link jest dobry. Wersja 1.1 jest tuż za rogiem i w przyszłości sytuacja może się ponownie zmienić.

Podczas uruchamiania kontenera pamiętaj o udostępnieniu portu gościa 80 zgodnie z ustawieniem zmiennej środowiskowej. Na przykład:

docker run -d -p 8000:80 myapp
curl localhost:8000
GrandOpener
źródło
1
to był również mój przypadek użycia, a link był niezwykle pomocny. Dziękuję Ci.
Oxymoron
3

W przypadku AspNetCore 3.1+ wystarczy dodać następujący wiersz w pliku appsettings.json:

"Urls": "http://*:80"
Ludovic Feltz
źródło
1
Działa jak marzenie. Nie mogę znaleźć powodu, dla którego rozwiązania z hosting.jsonnie działają.
Machado
0

Ustaw zmienną środowiskową ASPNETCORE_URLSna http://0.0.0.0:5000/.

W przypadku uruchamiania z programu Visual Studio należy dodać zmienną środowiskową z karty Debugowanie we właściwościach projektu.

Edward Brey
źródło