Веб-сервер на моем Raspberry Pi 3 с Win 10 IoT

#c# #server #uwp

#c# #сервер #uwp

Вопрос:

Я пытаюсь запустить веб-сервер на моем Raspberry Pi 3 с Win 10 IoT.

Он показывает мне строку отладки «ЗАПУСТИТЬ ВЕБ-СЕРВЕР», но не строку «ОБРАБОТАТЬ ЗАПРОС» в консоли вывода. Когда я пытаюсь открыть страницу с помощью своего браузера (с другого устройства в той же сети), страница не загружается.

Я могу получить доступ к порталу устройств на порту 8080 без проблем, так что это не проблема с брандмауэром или чем-то в этом роде.

В манифесте я добавляю частные сети (клиент и сервер).

 WebServer server = new WebServer();
server.Initialise();

public class WebServer
{
    private StreamSocketListener listener;
    private const uint BufferSize = 8192;

    public WebServer(){}

    public async void Initialise()
    {
        Debug.WriteLine("START WEBSERVER");
        listener = new StreamSocketListener();
        await listener.BindServiceNameAsync("80");

        listener.ConnectionReceived  = (sender, args) =>
        {
            HandleRequest(sender, args);
        };
    }

    public async void HandleRequest(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
    {
        StringBuilder request = new StringBuilder();
        using (IInputStream input = args.Socket.InputStream)
        {
            byte[] data = new byte[BufferSize];
            IBuffer buffer = data.AsBuffer();
            uint dataRead = BufferSize;
            while (dataRead == BufferSize)
            {
                await input.ReadAsync(buffer, BufferSize, InputStreamOptions.Partial);
                request.Append(Encoding.UTF8.GetString(data, 0, data.Length));
                dataRead = buffer.Length;
            }
        }

        using (IOutputStream output = args.Socket.OutputStream)
        {
            using (Stream response = output.AsStreamForWrite())
            {
                byte[] bodyArray = Encoding.UTF8.GetBytes("<html><body>Hello, World!</body></html>");

                var bodyStream = new MemoryStream(bodyArray);

                var header = "HTTP/1.1 200 OKrn"  
                            $"Content-Length: {bodyStream.Length}rn"  
                                "Connection: closernrn";

                byte[] headerArray = Encoding.UTF8.GetBytes(header);

                await response.WriteAsync(headerArray, 0, headerArray.Length);
                await bodyStream.CopyToAsync(response);
                await response.FlushAsync();
            }
        }

    }

}
  

Ответ №1:

Обычно это происходит, потому что одна из приведенных ниже причин :

— доступ к странице ограничен только для устройства, на котором вы загружаете службу.
-переулок не поддерживает службы между устройствами
— Проблемы с брандмауэром или переадресация порта.

Попробуйте проверить свой сервис или попробуйте запустить его на фактически открытом порту в переулке. Откройте порт ex (554) на вашем шлюзе Retour и используйте его в своем прослушивающем устройстве.

обратите внимание, что иногда проблема может возникнуть, если у вас нет виртуализации в вашем BIOS.

Ответ №2:

Решением было добавление в манифест «Интернет (клиент и сервер)». Частная сеть не работает.