2015-12-10 2 views
49

J'ai déployé mon application C#, asp.net 5, mvc 6 sur un serveur Windows 2008. J'ai allumé dnx web et il écoute le port 5000 et fonctionne très bien lors de l'accès à partir de l'ordinateur local.Comment puis-je obtenir le serveur web Kestrel pour écouter les demandes non localhost?

Comment l'obtenir pour écouter des demandes non-localhost?

P.S. Ce question n'est pas une copie de ceci ... il fait référence à asp.net pre RC1 quand hosting.ini avait en fait un format .ini. Maintenant, c'est JSON et je ne trouve aucune documentation sur ce qui devrait vraiment s'y trouver.

P.P.S. La vraie solution est dans le non-accepté answer à la question liée, avec une mise en garde massive. Étapes:

  1. Modifiez votre projet.json par la réponse liée.
  2. Publiez votre projet sur votre serveur.
  3. Sur le serveur, accédez au dossier ... \ approot \ src \ YourProject et ouvrez une fenêtre de commande.
  4. Run dnx web - il échouera
  5. Run dnu restore
  6. 'dnu build`
  7. Run' Run DNX web` - le serveur web doit maintenant commencer à bien
+0

double possible de [ASP.NET 5 Kestrel se connecter dans le réseau local] (http://stackoverflow.com/questions/33975949/asp-net-5-kestrel-connect-within-lan) –

+0

Eh bien, la deuxième réponse à la question liée fait référence au format JSON. Ce n'est pas utile pour vous non plus? –

+0

@chuex J'ai essayé cela, et initialement, il s'est écrasé sur le serveur Web au démarrage. Pas certain de pourquoi. Puis j'ai fait 'dnu restore', suivi de' dnu build' et ensuite 'dnx web' a correctement démarré le serveur web. Je ne sais pas pourquoi cela se passe, mais au moins je suis capable de le faire fonctionner. Il y a certainement un bug qui doit être corrigé avant la version finale. Pour l'instant, c'est la solution de contournement. – AngryHacker

Répondre

75

Le fichier de configuration par défaut utilisé par Le serveur Kestrel est le hosting.json. Le nom a été changé plusieurs fois dans différentes versions bêta. Si vous utilisez maintenant project.json avec la section "command" suivante

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

puis lors du démarrage du serveur à partir de la ligne de commande par

dnx web 

le fichier hosting.json sera lu. Le fichier

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

configurera le serveur pour écouter 5000 sur chaque adresse IP4. La configuration

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

informera à écouter 5000 à la fois IP4 et adresse IP6.

On peut spécifier d'autres fichiers de configuration en utilisant la variable d'environnement ASPNET_ENV ou en utilisant --config myconfig1.json (ou config=myconfig1.json). Par exemple, vous pouvez utiliser

SET ASPNET_ENV=Development 

et de créer un fichier hosting.Development.json avec une configuration spécifique. Vous pouvez également utiliser project.json avec

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

et démarrer le serveur par l'utilisation

dnx webProd 

Je dois rappeler en outre qu'il pourrait être nécessaire que vous permettre d'écouter plus et pour vous inscrire (pour commencer dnx web) .C'est nécessaire à cause du pare-feu et de la sécurité locale d'écoute des nouveaux ports TCP/HTTP. Quelque chose comme ci-dessous devrait faire local et l'écoute enregistrement de 5000 ports pour tout le monde (IPv4 et 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 

Pour être plus sûr, vous pouvez ajuster la configuration ci-dessus pour accorder des droits minimaux.

MISE À JOUR: Merci @BlaneBunderson. On peut utiliser * au lieu d'adresse IP (comme http://*:5000) pour écouter adresses IP4 et IP6 à partir de n'importe quelle interface. Il faut être soigneusement et ne pas utiliser http://*:5000;http://::5000, http://::5000;http://*:5000, http://*:5000;http://0.0.0.0:5000 ou http://*:5000;http://0.0.0.0:5000 parce qu'il faudra pour vous inscrire IP6 adresse :: ou l'adresse IP4 0.0.0.0deux fois.

Correspond à the announcement

Techniquement, tout nom d'hôte qui ne sont pas « localhost » ou IPv4 valide ou adresse IPv6 causeront Kestrel se lier à toutes les interfaces réseau.

Je pense que le comportement pourrait être modifié dans le futur. Ainsi, je recommanderais d'utiliser uniquement les formulaires *:5000, 0.0.0.0:5000 et ::5000 pour l'enregistrement de n'importe quelle adresse informatique. ASP2NET Core RC2 modifie (voir the announcement) le comportement de chargement des valeurs par défaut. On doit faire des changements dans le Main pour charger les paramètres de hosting.json et les paramètres de ligne de commande. Ci-dessous un exemple de l'utilisation

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

L'utilisation de code ci-dessus trois liaisons: "http://*:1000", "https://*:1234", "http://0.0.0.0:5000" par défaut au lieu de l'utilisation du port par défaut 5000 par défaut (pour être exact l'utilisation de http://localhost:5000). L'appel de .UseConfiguration(config) est effectué après.UseUrls. Ainsi, la configuration chargée à partir de hosting.json ou la ligne de commande remplace les options par défaut. Si l'on supprime la ligne .SetBasePath(Directory.GetCurrentDirectory()), le hosting.json sera chargé à partir du même répertoire où la DLL d'application sera compilée (par exemple bin\Debug\netcoreapp1.0).

On peut utiliser l'exécution comme

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

pour remplacer les paramètres par défaut (de UseUrls) et les paramètres de "server.urls" propriété de hosting.json si elle est existe.

De la même façon, on pourrait remplacer les paramètres ULR en définissant la variable d'environnement

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

alors le démarrage par défaut de l'application à l'aide dotnet.exe run utilisera http://localhost:12541/ pour la liaison.

Vous pouvez trouver here un exemple de l'utilisation de la liaison HTTPS.

+1

En outre, vous pouvez utiliser "server.urls": "http: // *: 5000" au lieu de "server.urls": "http://0.0.0.0:5000" (Personnellement, je pense que le * fait un peu plus sens.) –

+0

@BlaneBunderson: Merci pour votre suggestion! Je dois ajouter que 'http: // *: 5000' est le même que' http: // :: 5000; http: //0.0.0.0: 5000' et non 'http: //0.0.0.0: 5000' . Il force l'écoute à la fois pour IPv4 et IPv6. Vous pouvez le vérifier en utilisant 'http: // *: 5000; http: // :: 5000' ou' http: // :: 5000; http: // *: 5000'. On obtient l'erreur "Microsoft.AspNet.Server.Kestrel.Networking.UvException: erreur -4091 adresse EADDRINUSE déjà utilisée" lors de l'enregistrement de la deuxième adresse. Dans certains cas, l'enregistrement d'IPv4 et d'IPv6 est bon, dans d'autres cas, ce n'est pas bon. En tout cas c'est bon de mentionner le chemin. – Oleg

+0

Excellente mise à jour pour RC2, merci pour l'explication détaillée – Trygve

24

Dans RC2, la section des commandes de project.json n'est plus utilisée. Je n'ai pas encore permis à Kestrel de récupérer le fichier hosting.json, mais vous pouvez définir le port dans la partie Main de l'application où le nouveau WebHostBuilder est créé et configuré. Il suffit d'ajouter la méthode comme dans l'exemple ci-dessous

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

Cela a été d'une grande aide. J'ai utilisé '. UseUrls (" http: // *: 5000 ")' à la place, et le port a transmis 5000 avec l'IP hôte vide sur VirtualBox, et enfin je peux accéder aux points de terminaison .NET Core Docker-hébergés de mon Mac. Doux! –

+0

Pour plus d'informations sur l'utilisation de hosting.json dans RC2 et des explications plus détaillées, lisez la réponse d'Oleg ci-dessus, en particulier "Updated 2" – Trygve

+2

S'applique également à 1.0.0-preview2-003121, image docker – linquize

4

.UseUrls() Si vous essayez de mettre une application ASP.NET de base dans un conteneur de docker (ce qui était mon cas d'utilisation pour avoir besoin d'écouter des adresses non localhost), notez que ce cas d'utilisation a déjà été créé pour vous par Microsoft. A l'heure actuelle (v1.0.1), la clé magique pour résoudre ce problème est que le Dockerfile source contient un paramètre de variable d'environnement url, et l'application ne tente pas de surcharger cela. (En effet, une application conteneurisé devrait affirmer en interne aussi peu que possible sur l'environnement où elle se déroulera.)

ENV ASPNETCORE_URLS http://+:80 

Notez le signe plus plutôt que astérisque là. Je recommande en fait de visiter le lien dockerhub ci-dessus en lisant ma réponse aussi longtemps que le lien est bon. Version 1.1 est juste autour du coin, et les choses peuvent changer à nouveau dans le futur. Lors de l'exécution du conteneur, veillez à exposer le port invité 80, conformément au paramètre de variable d'environnement.

Par exemple:

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