J'ai une simple API Web .net avec une action:
[Route("[action]")]
public class APIController : Controller
{
// GET api/values
[HttpGet]
public string Ping()
{
return DateTime.Now.ToString();
}
}
Si je lance ceci via l'exécution de dotnet je reçois
Hosting environment: Production
Content root path: C:\Users\xxx\Documents\Visual Studio 2015\Projects\SelfHostTest\src\SelfHostTest
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
Aller au navigateur et taper http: // localhost: 5000/ping donne un retour réussi de l'heure actuelle. Cependant aller sur un ordinateur distant (même réseau local) et tenter d'accéder au service via http: // odin: 5000/ping génère une erreur 404. (Odin est le nom de la machine qui exécute l’API Web dans une console via le lancement de dotnet).
Les pare-feu serveur (et client!) Sont désactivés. Je peux cingler "odin" avec succès.
Toutes les idées quelle étape simple me manque ici. J'ai essayé cela à la maison et au travail sans succès.
À mon avis, le problème ne réside pas dans votre contrôleur, mais dans program.cs. Vous devez modifier la construction de votre WebHost
var Host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseUrls("http://localhost:5000", "http://odin:5000", "http://192.168.1.2:5000")
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
À moins d'ajouter la ligne UseUrls, Kestrel n'écoutera pas en dehors de localhost. Cela a du sens, car dans une situation normale, Kestrel sera assis derrière un proxy inverse tel que IIS ou NGNIX et n'a pas besoin de se connecter à des URL externes.
Dans mon cas (noyau .NET 2.1), j'ai dû modifier le fichier Properties/launchSettings.json
.
Définissez applicationUrl
sur une liste d'URL autorisées séparées par des points-virgules, comme ceci
"applicationUrl": "https://localhost:5001;http://odin:5000"
J'espère que cela aide quelqu'un là-bas.
Vous pouvez simplement faire ce qui suit pour créer votre WebHost, cela autorisera les connexions à distance à Kestrel.
var Host = WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:80")
.UseStartup<Startup>()
.Build();
Après avoir utilisé le code suivant, je ne pouvais toujours pas accéder à mon API à distance, je devais désactiver les cartes réseau créées par Docker dans le panneau de configuration de Windows (Panneau de configuration\Réseau et Connexions Internet\Réseau).
Il existe un moyen plus précis lorsque plusieurs adresses IP sont disponibles sur la machine locale. Connectez un socket UDP et lisez son point de terminaison local:
string localIP;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
socket.Connect("8.8.8.8", 65530);
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
localIP = endPoint.Address.ToString();
}
Une autre façon de résoudre ce problème consiste à éditer le fichier "applicationhost.config". Dans le dossier du projet -> .vs (dossier caché) -> config Ouvrir le fichier "applicationhost.config". Sous la section Sites, nom du site = "nom de votre projet" dans le nœud Liaisons, ajoutez une autre liaison et changez localhost avec votre "IP/Domaine" sur "bindingInformation", comme ceci:
<site name="project_name" id="2">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="D:\Projects\project_directory" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:5000:localhost" />
<binding protocol="http" bindingInformation="*:5000:192.168.1.2" />
<binding protocol="http" bindingInformation="*:5000:odin" />
</bindings>
</site>
n'oubliez pas que Visual Studio doit être exécuté en tant qu'administrateur.