2015-11-06 20 views
6

Ich schreibe einen Web-Server als Universal Windows Platform App in C#. Hier ist mein Code so weit:Erstellen eines Webservers in C# UWP

sealed partial class App : Application 
    { 
     int port = 8000; 

     /// <summary> 
     /// Initializes the singleton application object. This is the first line of authored code 
     /// executed, and as such is the logical equivalent of main() or WinMain(). 
     /// </summary> 
     public App() 
     { 
      StartServer(); 
     } 

     private void StartServer() 
     { 
      StreamSocketListener listener = new StreamSocketListener(); 
      listener.BindServiceNameAsync(port.ToString()); 
      Debug.WriteLine("Bound to port: " + port.ToString()); 
      listener.ConnectionReceived += async (s, e) => 
       { 
        Debug.WriteLine("Got connection"); 
        using (IInputStream input = e.Socket.InputStream) 
        { 
         var buffer = new Windows.Storage.Streams.Buffer(2); 
         await input.ReadAsync(buffer, buffer.Capacity, InputStreamOptions.Partial);  
        } 

        using (IOutputStream output = e.Socket.OutputStream) 
        { 
         using (Stream response = output.AsStreamForWrite()) 
         { 
          response.Write(Encoding.ASCII.GetBytes("Hello, World!"), 0, 1); 
         } 
        } 
       }; 
     } 
    } 

ich an den Server versucht, verbindet diese Adresse mit:

http://127.0.0.1:8000/C:/pathtohtmlfile/htmlfile.html

jedoch die Verbindungszeiten aus. Ich bin mir nicht sicher, ob es ein Problem mit dem C# -Code oder mit etwas anderem ist.

+0

Haben Sie sich das angesehen: http://loopback.codeplex.com/? WinRT- und UWP-Apps verfügen über einen Loopback-Schutz und das Tool wird es für die angegebenen Apps entfernen. Vielleicht ist das was du brauchst. – Rafael

+0

Loopback-Ausnahmen sind nur für Client-Sockets. –

Antwort

5

Wenn Sie einen Server in UWP App hosten, müssen Sie diese Dinge:

  1. Ihr Gerät, das diesen Code (Device A) ausgeführt und Gerät, die Ihre Web-Browser läuft (Device B) muss in einem gleiches LAN. Und Sie können den Browser in Gerät A nicht verwenden, um auf Ihren Dienst zuzugreifen.
  2. nutzen Sie WLAN, um auf Ihren Service zuzugreifen.
  3. Ihre App muss im Status ausgeführt werden.
  4. sollten Sie eine Methode schreiben IP-Adresse zu erhalten, aber nicht 127.0.0.1:

    public static string FindIPAddress() 
    { 
        List<string> ipAddresses = new List<string>(); 
        var hostnames = NetworkInformation.GetHostNames(); 
        foreach (var hn in hostnames) 
        { 
         //IanaInterfaceType == 71 => Wifi 
         //IanaInterfaceType == 6 => Ethernet (Emulator) 
         if (hn.IPInformation != null && 
          (hn.IPInformation.NetworkAdapter.IanaInterfaceType == 71 
          || hn.IPInformation.NetworkAdapter.IanaInterfaceType == 6)) 
         { 
          string ipAddress = hn.DisplayName; 
          ipAddresses.Add(ipAddress); 
         } 
        } 
    
        if (ipAddresses.Count < 1) 
        { 
         return null; 
        } 
        else if (ipAddresses.Count == 1) 
        { 
         return ipAddresses[0]; 
        } 
        else 
        { 
         return ipAddresses[ipAddresses.Count - 1]; 
        } 
    } 
    

    Und ich weiß nicht, warum jemand die Frage nach unten Abstimmung gegeben hat, ist es möglich, einen Web-Service auf Gastgeber Telefon/Tablet, natürlich ja.

+0

Haben Sie ein Beispiel dafür, wie Sie einen Webservice in WinRT hosten? Alles, was ich gefunden habe funktioniert überhaupt nicht – CodeNoob

+0

Ich liebe, wie das "else if" "else", macht keinen Sinn ;-D –

4

Die Lösung von Raymond Zuo funktioniert wirklich. Aber die Hauptsache, nicht zu vergessen, sind die Fähigkeiten in Packages.appxmanifest. Um den Server in privaten Netzwerken laufen sollte man hinzufügen:

<Capability Name="privateNetworkClientServer" /> 

Und um den Server in öffentlichem Netzwerk auszuführen:

<Capability Name="internetClientServer" /> 
1

Es ist möglich, einen Web-Service in einem Fenster Universal-Host App. Ich folgte dem Beispiel von http://www.dzhang.com/blog/2012/09/18/a-simple-in-process-http-server-for-windows-8-metro-apps, folgte auch den drei ersten Schritten von Raymond Zuos Lösung und legte schließlich auch die Firewall nieder. Leider konnte ich auf localhost nicht laufen, obwohl ich die Antworten von hier Cannot connect to localhost in windows store application folgte. Ich mache derzeit Java-HTTP-Anfragen an die Universal Platform App. Server und Client scheinen auf verschiedenen Hosts ausgeführt zu werden.

Verwandte Themen