【发布时间】:2016-04-26 21:21:08
【问题描述】:
我一直在使用“StreamSocketListener”在 PC 和带有 Windows 10 IoT(build 10586 TH2)的 Raspberry PI 2 之间进行一些通信。这在调试模式下似乎工作正常,但在发布模式下测试代码时,“StreamSocketListener”似乎随机停止响应请求。
在调试模式下,在 RPI2 上,我有 10 万个请求的会话没有一个问题,但是当我推送发布版本时,它会随机停止,很快(通常在数百个请求之后)。请求是静态类型的,所以每次的输入都是一样的。
有没有人遇到过同样的问题,有解决这个问题的办法吗?
代码基于这篇博文:
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++;
}
【问题讨论】:
-
有趣...如果禁用 .NET Native 编译,这还会重现吗? (项目属性 > BUILD > “启用 .NET Native 工具链”)
-
它已经被设置为禁用(未选中),所以我试图做的是启用它并以发布模式在 RPI2 上运行它。现在我已经运行了近 5 万个请求,没有任何问题......我不确定这告诉我什么,你能提供关于此的额外信息吗,马特?
-
.NET Native 是我们用于 UWP 应用程序的新的提前编译堆栈。登录页面有点过时,但您可以在此处找到更多信息:msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx。目前尚不清楚为什么这会解决问题,但这将是从商店提供 UWP 应用程序的方式......所以也许这已经足够好了?抱歉,我不能立即派上用场。 :-(
-
好的,感谢您提供更多信息!我将在启用和禁用设置的情况下进行更多测试,检查它是否真的解决了问题。我会在测试结束后更新我的问题,并且很可能会接受您的评论作为答案。
-
听起来不错。如果 .NET Native 给您带来其他问题,您可以通过 dotnetnative@microsoft.com 向我的团队发送邮件。祝你好运!
标签: c# uwp windows-10-iot-core