web-dev-qa-db-fra.com

Connectez-vous à distance à l'API Web auto-hébergée.

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.

8
Calanus

À 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.

16
Feasoron

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.

3
Mendy

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).

2
Alexander Cosman

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

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.

0
Hamed Nikzad