C#Windows 10 IoT StreamSocketListener在发布模式下随机停止侦听

时间:2016-01-20 20:39:33

标签: c# uwp windows-10-iot-core

我一直在使用" StreamSocketListener "在PC和带有Windows 10 IoT(版本10586 TH2)的Raspberry PI 2之间进行一些通信。这似乎在调试模式下工作正常,但在发布模式下测试代码时," StreamSocketListener "似乎随机停止响应请求。

在调试模式下,在RPI2上,我有100k请求的会话没有一个问题,但是当我推送发布版本时,它会非常快速地(通常在几百个请求之后)停止。请求是静态类型,因此每次输入都是相同的。

是否有人遇到过同样的问题,是否有解决此问题的方法?

该代码基于此博客文章:

A simple in-process HTTP server for Windows 8 Metro apps

 private void Listen()
 {
      _listener = new StreamSocketListener();
      _listener.ConnectionReceived += (s, e) => ProcessRequestAsync(e.Socket);
      _listener.BindServiceNameAsync(requestPort.ToString());
 }
private async void ProcessRequestAsync(StreamSocket socket)
    {
        try
        {
            // this works for text only
            StringBuilder request = new StringBuilder();
            using (IInputStream input = 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 = socket.OutputStream)
            {
                string requestMethod = request.ToString().Split('\n')[0];
                string[] requestParts = requestMethod.Split(' ');

                if (requestParts[0] == "GET")
                    await WriteResponseAsync(requestParts[1], output);
                else
                    throw new InvalidDataException("HTTP method not supported: "
                                                   + requestParts[0]);
            }
        }
        catch (Exception e)
        {
            Debug.WriteLine("Main ex: " + e);
        }
        RequestCount++;
    }

3 个答案:

答案 0 :(得分:3)

使用"编译.NET Native工具链"进行了一整天的长期测试。我的UWP项目的设置已打开,此问题似乎已修复。禁用此功能后,问题只会在几分钟后发生。

因为我不能接受评论作为答案,我只是回答我自己的问题,并接受它。但感谢Matt指出我正确的方向。

  

有趣......如果禁用.NET Native编译,这仍会重现吗? (项目属性> BUILD>"启用.NET Native工具链") - Matt Whilden

答案 1 :(得分:0)

Matt,Gnm: 我在Win-IoT 10.0.14393.693上运行的RPi3上遇到了完全相同的问题,C#代码与Gnm的第一篇文章非常相似:StreamSocketListener只是停下来收听/接收http POST消息而应用程序的其余部分(Web服务器后台服务)仍然响应。

但有两个不同之处: a)在我的机器上,在应用程序启动后的一分钟内发生,并且仅在一两个请求之后发生。 b)它发生在"编译.NET Native Tool链"选项切换到" ON"!

受到Gnm的调查结果的启发,我现在已将此选项切换为OFF,并且:我的问题似乎已得到解决。在撰写本文时,代码仅运行了一个小时,但现在看起来工作稳定。所以,令人惊讶的是,对我而言,Gnm的解决方案正好相反......

答案 2 :(得分:0)

仅供参考我对Windows 10 Iot c#app有同样的问题。我的解决方案是"用.NET Native Tool链编译"选项切换到" ON"那么"用.NET Native Tool链编译"选项切换到" OFF"!