2015-11-06 2 views
6

Я пишу веб-сервер в качестве приложения для универсальной платформы Windows на C#. Вот мой код до сих пор:Создание веб-сервера в 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); 
         } 
        } 
       }; 
     } 
    } 

Я попытался подключиться к серверу, используя этот адрес:

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

Однако соединение не будет. Я не уверен, что это проблема с кодом C# или с чем-то другим.

+0

Вы посмотрели на это: http://loopback.codeplex.com/? У приложений WinRT и UWP есть защита от петли и этот инструмент удалит его для указанных приложений. Возможно, это то, что вам нужно. – Rafael

+0

Исключения для Loopback для клиентских сокетов, к сожалению, –

ответ

5

Если вы хотите разместить сервер в UWP приложения, убедитесь, что эти вещи:

  1. устройства, которое запустить этот код (устройство) и устройство, которое ваш веб-браузер запустить (устройство B) должны в той же локальной сети. И вы не можете использовать браузер на устройстве A для доступа к вашему сервису.
  2. используйте WIFI для доступа к вашему сервису.
  3. ваше приложение должно быть в состоянии работы.
  4. вы должны написать метод, чтобы получить IP-адрес, но не 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]; 
        } 
    } 
    

    И я не знаю, почему кто-то дал вопрос до голосования, можно разместить веб-службы на телефон/планшет, конечно, да.

+0

Есть ли у вас пример того, как разместить веб-сервис в WinRT? Все, что я нашел, не работает вообще – CodeNoob

+0

Мне нравится, как «else if» «else», не имеет смысла; -D –

4

Решение Raymond Zuo действительно работает. Но главное не забывать о возможностях в Packages.appxmanifest. Для того чтобы запустить сервер в частных сетях следует добавить:

<Capability Name="privateNetworkClientServer" /> 

И для того, чтобы запустить сервер в общественной сети:

<Capability Name="internetClientServer" /> 
1

можно разместить веб-службы в окне Универсальный Приложение. Я следовал примеру от http://www.dzhang.com/blog/2012/09/18/a-simple-in-process-http-server-for-windows-8-metro-apps, также следил за тремя первыми шагами от решения Raymond Zuo, и, наконец, я также поместил брандмауэр. К сожалению, я не смог работать на локальном хосте, хотя я и следовал ответам отсюда Cannot connect to localhost in windows store application. В настоящее время я выполняю java-запросы HTTP для приложения Universal Platform. Определенно, сервер и клиент, как представляется, должны работать на разных хостах.

Смежные вопросы