2017-01-06 28 views
6

Próbuję dowiedzieć się właściwy sposób modyfikowania URL (-y), który nasłuchuje na pustułka z konstruktora klasy Uruchomienie.Jak skonfigurować adresy Kestrel w klasie startowej

Aktualizacja: Oprócz odpowiedzi poniżej zrozumiałem, że klasa Startup nie służy do konfiguracji Kestrel w sposób, w jaki myślałem. Myślałem, że Startup utworzyłby pojedynczy obiekt konfiguracyjny dla całej aplikacji, który byłby zlokalizowany przez konwencję, tak nie jest. Jak wskazuje @Tena, konfiguracja aplikacji i hostingu to osobny problem. Połączona odpowiedź i zaakceptowana odpowiedź dostarczają przykładów roboczych.

Obróciłem się zupełnie nowe Ubuntu 14 skrzynki w Vagrant i zainstalowany ASP.NET Core 1.1, zgodnie z obowiązującymi instrukcjami Microsoft: https://www.microsoft.com/net/core#linuxubuntu

wpadłem:

  • dotnet nowego -t web
  • DotNet przywrócić
  • prowadzony DotNet

Ta funkcja domyślnie nasłuchuje na http://localhost:5000. W Program.cs mogę wywołać app.UseUrls ("http: // *: 5001) i to działa, aby zmienić adres URL i port."

Naprawdę chcę zmienić adresy URL zgodnie z konwencją, dodając nowy JSON ustawienie pliku startowego w klasie, więc po przykłady i utworzony plik hosting.JSON z tym (uwaga: próbowałem „server.urls” i „adres URL” jako klucz).

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

przy starcie .cs poniżej domyślnych linii dodawania plików appsettings.json dodałem .AddJsonFile ("hosting.json", opcjonalnie: false); (opcjonalnie: false, aby upewnić się, że podniósł plik)

public Startup(IHostingEnvironment env) 
{ 
    var builder = new ConfigurationBuilder() 
    .SetBasePath(env.ContentRootPath) 
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
    .AddJsonFile("hosting.json", optional: false); 
    if (env.IsDevelopment()) 
    { 
    // For more details on using the user secret store see https://go.microsoft.com/fwlink/?LinkID=532709 
    builder.AddUserSecrets(); 
    } 

    builder.AddEnvironmentVariables(); 
    Configuration = builder.Build(); 
} 

I sprawdzeniu, że ustawienie jest tam po konfiguracja buduje, ale to nie jest odbierane lub używane, gdy komputer jest zbudowany w Program.cs

public class Program 
{ 
    public static void Main(string[] args) 
    { 
    var host = new WebHostBuilder() 
    .UseKestrel() 
    .UseContentRoot(Directory.GetCurrentDirectory()) 
    .UseIISIntegration() 
    .UseStartup<Startup>() 
    .Build(); 

    host.Run(); 
    } 
} 

a aplikacja ciągle zaczyna słuchać na localhost: 5000. Jest to moje (prawdopodobnie błędne) zrozumienie, że poprzez ustawienie odpowiednio nazwane z odpowiednim kluczem WebHostBuidler powinien go podnieść i użyć.

Widziałem inne przykłady, które w zasadzie pozbyć klasie startowej i utworzyć konfigurację w Program.cs gdzie mogą być następnie przekazany do wywołania UseConfiguration ale znowu mi się, że za pomocą klasy startowy powinien Zrób to według konwencji.

Zasadniczo Chciałbym zachować Uruchamianie i Programu oddzielić, dodać plik hosting.JSON do konfiguracji z adresami URL i go podniósł i wykorzystywane bez konieczności zadzwonić UseUrls, UseConfiguration, etc

Czy brakuje mi czegoś oczywistego lub próbuję zrobić coś, co nie jest poprawne?

Aby wyjaśnić, dlaczego to nie jest duplikatem, jak na mój komentarz:

  • To zakładać specjalnie mówi "launcherSettings jest dla Visual Studio F5". Używam wiersza poleceń w systemie Linux. Nic wspólnego z VS.

  • Rozwiązanie dostarczone w tym poście przeniosło konfigurację konfiguracji do głównej metody. Mówię konkretnie, że chcę zbudować moją konfigurację w klasie Startup, tak jak domyślny projekt "dotnet new -t web".

Nie czuję to jest duplikatem, a ja nadal przeglądając źródła ASP.NET Core sprawdzić, czy jest to możliwe.

W odniesieniu do prawidłowego klucza:

https://github.com/aspnet/Hosting/blob/b6da89f54cff11474f17486cdc55c2f21f2bbd6b/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs

namespace Microsoft.AspNetCore.Hosting 
{ 
    public static class WebHostDefaults 
    { 
    public static readonly string ApplicationKey = "applicationName"; 
    public static readonly string StartupAssemblyKey = "startupAssembly"; 
    public static readonly string DetailedErrorsKey = "detailedErrors"; 
    public static readonly string EnvironmentKey = "environment"; 
    public static readonly string WebRootKey = "webroot"; 
    public static readonly string CaptureStartupErrorsKey = "captureStartupErrors"; 
    public static readonly string ServerUrlsKey = "urls"; 
    public static readonly string ContentRootKey = "contentRoot"; 
    } 
} 

https://github.com/aspnet/Hosting/blob/80ae7f056c08b740820ee42a7df9eae34541e49e/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs

public class WebHost : IWebHost 
{ 
    private static readonly string DeprecatedServerUrlsKey = "server.urls"; 
+1

Możliwy duplikat [Nie można ustawić port dla aplikacji Net.Core w launchSettings.JSON] (http://stackoverflow.com/questions/40550798/cant-set-the-port-for -net-core-application-in-launchsettings-json) – Tseng

+0

Poprawny ciąg jest btw. 'server.urls', ale nie jestem już pewien, czy to będzie działać w starcie i jeśli jest już za późno. Z połączonym jeden zadziała na pewno (czytając hosting w głównej metodzie i przekazuje go do budowniczego) – Tseng

+0

Przeczytaj odpowiedź, obejmuje dokładnie to samo i zajmuje się ustawianiem portu dla pustułki. Plakat był początkowo zdezorientowany przez wyrzutnię Ustawienia – Tseng

Odpowiedz

3

W pliku hosting.json należy użyć server.urls zamiast adresów URL. Plik host.json należy dodać w pliku program.cs (w metodzie głównej), a nie podczas uruchamiania.

Oto mój plik hosting.json.

{ 
    "server.urls": "http://localhost:5010;http://localhost:5012" 
} 

Oto główna metoda.

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

    var host = new WebHostBuilder() 
     .UseConfiguration(config) 
     .UseKestrel() 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .UseIISIntegration() 
     .UseStartup<Startup>() 
     .Build(); 

    host.Run(); 
} 

A oto zrzut ekranu.

Screenshot of ASP.NET Core app running

+0

Dziękuję, jestem świadomy, że ta technika działa, ale jak na mój pierwotny post, szukam sposobu na utrzymanie rozdziału Startup i Programu. Chcę zachować konfigurację w Startup, jak to jest w domyślnym projekcie utworzonym za pomocą dotnet new -t web. Nie rozumiem, dlaczego konfigurowanie adresów URL wymagałoby przeniesienia konfiguracji do klasy Program lub Main. – Steve

+1

@Steve: Ponieważ obie konfiguracje nie są powiązane. Jeden jest dla twojej aplikacji, drugi to tylko hosting powiązany. Po prostu używają tej samej konfiguracji/biblioteki do jej osiągnięcia. Możesz także użyć wiersza poleceń lub zmiennych środowiskowych, aby ustawić port, wszystkie sposoby są w połączonej ** odpowiedzi ** (nie po wpisie) – Tseng

+0

@ Dziękuję! Miałem błędne przekonanie, że Startup może być użyty do stworzenia globalnej instancji konfiguracji, która będzie umiejscowiona przez konwencję przez resztę aplikacji. Spędzanie ostatniej godziny w źródle z myślą o tym komentarzu zapewnia głębsze zrozumienie. Problem polega na tym, że nikt nie powiedział "nie możesz tego zrobić tak, jak myślisz", a zamiast tego zaoferował alternatywne rozwiązania, które nie rozwiązały mojego problemu. Czy mógłbyś zamienić swój komentarz w odpowiedź, którą mogę zaakceptować? – Steve