2015-11-06 14 views
6

Tôi đang viết một máy chủ web dưới dạng ứng dụng Nền tảng Windows phổ biến trong C#. Đây là mã của tôi cho đến nay:Tạo một máy chủ web trong 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); 
         } 
        } 
       }; 
     } 
    } 

Tôi đã cố gắng kết nối với máy chủ sử dụng địa chỉ này:

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

Tuy nhiên, thời gian kết nối ra. Tôi không chắc chắn nếu nó là một vấn đề với mã C# hoặc với cái gì khác.

+0

Bạn đã xem xét điều này: http://loopback.codeplex.com/? Ứng dụng WinRT và UWP có tính năng bảo vệ vòng lặp và công cụ đó sẽ xóa ứng dụng đó cho các ứng dụng được chỉ định. Có lẽ đây là những gì bạn cần. – Rafael

+0

Trường hợp ngoại lệ vòng lặp chỉ dành cho ổ cắm máy khách –

Trả lời

5

Nếu bạn muốn lưu trữ một máy chủ trong ứng dụng UWP, hãy chắc chắn những điều này:

  1. thiết bị của bạn mà chạy mã này (Device A) và thiết bị mà trình duyệt web chạy của bạn (Device B) phải ở một cùng một mạng LAN. Và bạn không thể sử dụng trình duyệt trong Thiết bị A để truy cập dịch vụ của bạn.
  2. sử dụng WIFI để truy cập dịch vụ của bạn.
  3. ứng dụng của bạn phải ở trạng thái chạy.
  4. bạn nên viết một phương pháp để có được địa chỉ IP, nhưng không phải là 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]; 
        } 
    } 
    

    Và tôi không biết tại sao một người nào đó đã đưa ra câu hỏi xuống bỏ phiếu, là nó có thể để lưu trữ một dịch vụ web trên điện thoại/máy tính bảng, tất nhiên là có.

+0

Bạn có ví dụ về cách lưu trữ một webservice trong WinRT không? Tất cả những gì tôi thấy không hoạt động ở tất cả – CodeNoob

+0

Tôi thích cách "khác nếu" "khác", không có ý nghĩa ;-D –

4

Giải pháp của Raymond Zuo thực sự hiệu quả. Nhưng điều chính không nên quên là các khả năng trong Packages.appxmanifest. Để chạy các máy chủ trong mạng Private ta nên thêm:

<Capability Name="privateNetworkClientServer" /> 

Và để chạy các máy chủ trong mạng công cộng:

<Capability Name="internetClientServer" /> 
1

Có thể tổ chức một dịch vụ web trong một cửa sổ phổ Ứng dụng. Tôi theo ví dụ từ http://www.dzhang.com/blog/2012/09/18/a-simple-in-process-http-server-for-windows-8-metro-apps, cũng theo ba bước đầu tiên từ giải pháp của Raymond Zuo và cuối cùng tôi cũng đặt tường lửa xuống. Thật không may, tôi đã không thể chạy trên localhost mặc dù tôi đã làm theo các câu trả lời từ đây Cannot connect to localhost in windows store application. Tôi hiện đang thực hiện các yêu cầu java http cho Ứng dụng nền tảng chung. Chắc chắn, máy chủ và máy khách dường như được yêu cầu chạy trên các máy chủ khác nhau.

Các vấn đề liên quan