2016-09-27 7 views
4

ich einen einfachen .net Kern web api mit einer Aktion habe:Remotely auf .net Kern selbst gehosteten Web-api verbinden

[Route("[action]")] 
    public class APIController : Controller 
    { 
     // GET api/values 
     [HttpGet] 
     public string Ping() 
     { 
      return DateTime.Now.ToString(); 
     } 
    } 

Wenn ich das über Dotnet Lauf laufe ich

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. 

Gehen an den Browser und Eingabe http://localhost:5000/ping führt zu einer erfolgreichen Rückkehr der aktuellen Zeit. Jedoch gehen zu einem Remote-Computer (gleichen LAN) und versuchen, auf den Dienst über http://odin:5000/ping zuzugreifen, führt zu einem 404-Fehler. (Odin ist der Name der Maschine, auf der die Web-API in einer Konsole über den Dotnet-Lauf läuft).

Beide Server (und Client!) Firewalls sind ausgeschaltet. Ich kann erfolgreich "odin" pingen.

Irgendwelche Ideen, welchen einfachen Schritt ich hier vermisse. Ich habe das zu Hause und bei der Arbeit ohne Erfolg versucht.

+0

Was passiert, wenn Sie versuchen, mit der IP-Adresse von 'Odin'? Bsp .: 192.111.11.2:5000? Kann [this] (http://stackoverflow.com/questions/12460562/consuming-asp-net-web-api-service-from-other-computer-in-lan) kann Ihnen helfen. –

+0

gleiche Sache versuchte 192.168.1.2, sowohl auf dem Server als auch auf dem Client. 127.0.0.1 funktioniert jedoch auf dem Server! – Calanus

Antwort

6

Meine Vermutung ist, dass das Problem nicht in Ihrem Controller ist, ist es in program.cs. Sie müssen den Aufbau Ihrer 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(); 

ändern, wenn Sie die UseUrls Zeile hinzufügen, Kestrel wird nicht außerhalb von localhost zu hören. Dies ist sinnvoll, da Kestrel in einer normalen Situation hinter einem Reverse Proxy wie IIS oder NGNIX sitzt und nicht an externe URLs gebunden werden muss.

+0

Danke - das funktioniert! Ratet mal, diese Art von Konfiguration muss wirklich in irgendeiner Art von Konfigurationsdatei sein ...? – Calanus

+2

Entweder das oder Sie können die spezielle Umgebungsvariable ASPNETCORE_URLS verwenden. Ich möchte jedoch nicht direkt mit Kestrel in der Produktion zuhören. Es ist wirklich das Beste, wenn es hinter etwas anderem sitzt. – Feasoron

+0

Zusätzlich können Sie '.UseUrls (" http: // *: 5000 ") verwenden, um alle eingehenden Anfragen von Port' 5000' zu akzeptieren! – Wingjam

0

Es gibt eine genauere Möglichkeit, wenn auf dem lokalen Computer mehrere IP-Adressen verfügbar sind. Schließen Sie einen UDP-Socket und lesen seine lokalen Endpunkt:

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

können Sie einfach die folgenden Schritte aus Ihrer WebHost zu erstellen, wird dies ermöglichen Remote-Verbindungen kestrel.

var host = WebHost.CreateDefaultBuilder(args) 
       .UseUrls("http://0.0.0.0:80") 
       .UseStartup<Startup>() 
       .Build(); 

Nach dem folgenden Code war ich noch nicht in der Lage aus der Ferne meine API zugreifen, hatte ich die Netzwerkadapter von Docker in der Windows-Systemsteuerung (Control Panel \ Netzwerk und Internet \ Netzwerkverbindungen) erstellt deaktivieren

0

Eine weitere Möglichkeit, dieses Problem zu lösen, ist die Bearbeitung der Datei "applicationhost.config". im Projektordner -> .vs (Versteckter Ordner) -> config Öffnen Sie die Datei "applicationhost.config". Unter Sites Abschnitt Website name = „Projektnamen“ in Bindings Knoten eine andere Bindung und Änderung localhost mit Ihrem „IP/Domain“ auf „binding“, wie diese hinzu:

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

Visual Studio erinnern müssen ausgeführt werden Administrator.

Verwandte Themen