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

本文关键字:模式 随机 IoT Windows StreamSocketListener 布模式 | 更新日期: 2023-09-27 18:31:09

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

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

没有人遇到过同样的问题,有解决这个问题的方法吗?

该代码基于此博客文章:

适用于 Windows 8 Metro 应用程序的简单进程内 HTTP 服务器

 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++;
    }

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

经过一整天的长期测试,为我的 UWP 项目打开了"使用 .NET 本机工具链编译"设置,此问题似乎已解决。禁用此功能时,问题会在几分钟后发生。

因为我不能接受评论作为答案,所以我只会回答我自己的问题,并接受它。但这一切都要感谢马特为我指出了正确的方向。

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

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

不过有两个区别:a) 在我的机器上,这已经在应用程序启动后一分钟内发生,并且仅在一两个请求之后发生。b) 并且它发生在"使用 .NET 本机工具链编译"选项切换到"ON"的情况下!

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

仅供参考,我在Windows 10 IoT c#应用程序上遇到了同样的问题。 我的修复是"使用.NET本机工具链编译"选项切换到"ON",然后"使用.NET本机工具链编译"选项切换到"OFF"!