2015-11-06 13 views
6

Piszę serwer WWW jako uniwersalną aplikację Windows Platform w języku C#. Oto mój kod do tej pory:Tworzenie serwera WWW w 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); 
         } 
        } 
       }; 
     } 
    } 

Próbowałem łączenia się z serwerem za pomocą tego adresu:

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

Jednak czasy połączeń na zewnątrz. Nie jestem pewien, czy jest to problem z kodem C# lub z czymś innym.

+0

Czy spojrzałeś na to: http://loopback.codeplex.com/? Aplikacje WinRT i UWP mają zabezpieczenie zwrotne, a to narzędzie usunie je dla określonych aplikacji. Może tego właśnie potrzebujesz. – Rafael

+0

Wyjątki dotyczące pętli zwrotnej dotyczą tylko gniazd klientów. Niestety, mamy następujący kod: –

Odpowiedz

5

Jeśli chcesz udostępnić serwer w UWP aplikacji, należy te rzeczy:

  1. urządzenie, które uruchomić ten kod (urządzenie A) i urządzenie, które swoją run przeglądarka internetowa (Device b) musi przy A ta sama sieć LAN. I nie możesz korzystać z przeglądarki na urządzeniu A, aby uzyskać dostęp do swojej usługi.
  2. użyj WIFI, aby uzyskać dostęp do usługi.
  3. Twoja aplikacja musi być w stanie uruchomionym.
  4. należy napisać metodę, aby uzyskać adres ip, ale nie 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]; 
        } 
    } 
    

    I nie wiem, dlaczego ktoś dał pytanie dół głos, to jest możliwe do zorganizowania usługi internetowej na telefon/tablet, oczywiście tak.

+0

Czy masz przykład jak obsługiwać serwis WWW w WinRT? Wszystko, co znalazłem, w ogóle nie działa – CodeNoob

+0

Uwielbiam, jak "inaczej, jeśli" "jeszcze", nie ma sensu ;-D –

4

Rozwiązanie Raymonda Zuo naprawdę działa. Ale najważniejsze, aby nie zapomnieć o możliwościach w Packages.appxmanifest. W celu uruchomienia serwera w sieci prywatnych należy dodać:

<Capability Name="privateNetworkClientServer" /> 

I w celu uruchomienia serwera w sieci publicznej:

<Capability Name="internetClientServer" /> 
1

Jest możliwość zorganizowania usługi internetowej w oknie Universalu App. Podążyłem za przykładem z http://www.dzhang.com/blog/2012/09/18/a-simple-in-process-http-server-for-windows-8-metro-apps, również poszedłem za trzema pierwszymi krokami z rozwiązania Raymonda Zuo, a na końcu również umieściłem zaporę. Niestety, nie byłem w stanie uruchomić na localhost, mimo że podążyłem za odpowiedziami tutaj Cannot connect to localhost in windows store application. Obecnie wykonuję żądania HTTP java do aplikacji Universal Platform. Zdecydowanie serwer i klient wydają się być wymagane do uruchomienia na różnych hostach.