【问题标题】:In process web server in UWP app to receive JSON messagesUWP 应用程序中的进程 Web 服务器以接收 JSON 消息
【发布时间】:2017-12-05 02:04:05
【问题描述】:

我有一个问题,我一直在关注这个帖子:

IoT core background webserver

建立我的后台网络服务器。但是,这篇文章以及我阅读的大多数文章都只是一个无头后台服务。就我而言,我确实有一个带有 UI 的主应用程序,用户可以查看并与之交互。所以,我不是无头,我希望应用程序在设备启动时启动并显示 UI。但是,我还想要一个始终在后台运行的 Web 服务器(从应用程序内部)来监听要发布的 JSON 消息。例如,如果我想通过向设备/应用发送 JSON 消息来更改 UI 上的文本。

我了解这通常被称为进程内 Web 服务器。因此,我利用上面的大部分链接来实现 Web 服务器类,然后从后面的 MainPage.xaml.cs 代码中,我这样做是为了在另一个线程上实例化 Web 服务器类以侦听消息:

    private async void StartServer()
    {
        var webServer = new WebServer();

        await ThreadPool.RunAsync((workItem) =>
        {
            webServer.Start();
        });
    }

这是在后台线程中启动 Web 服务器的正确方法吗?当我阅读代码时(对我来说很轻松,因为我仍在学习所有这些东西),似乎 Web 服务将在线程池中启动,但在收到一条消息后停止。这是正确的还是会无限期地继续运行(或只要应用程序正在运行)?

谢谢!

【问题讨论】:

    标签: c# multithreading windows-10-universal windows-10-iot-core


    【解决方案1】:

    是的,在headed UWP Application的后台线程中启动Web服务器是正确的方法。在线程池中,Web服务在收到消息后不会停止,因为WebServer的对象没有被释放。

    首先请参考.Net Framework中的Object Lifetime。这个topic也是关于对象的生命周期的。 webServer 对象在应用程序退出之前不会被释放。

    其次,HTTP 1.1 实现了persistent connections。在您提到的代码中,每个连接都将在 Web 服务器响应客户端(Web 浏览器)后关闭。因此将建立一个单独的 TCP 连接来获取此 Web 服务器中的每个请求。

    var header = $"HTTP/1.1 200 OK\r\nContent-Length: {bodyStream.Length}\r\n连接:关闭\r\n\r\n";

    【讨论】:

    • 感谢您对我的问题的详细回复和回答,我现在知道该怎么做了。关于您对持久连接的评论的一个后续问题,这可以吗?如果我打算每隔一段时间向 Web 服务器发送一条 JSON 消息(比如说每天一次),那么 TCP 连接在我收到消息后关闭是有意义的,因此没有打开连接,下次消息被发送,一个新的连接被打开。可以吗?给定 Connection:close 的行为?
    • 在这个请求频率下(一天一次)没问题。但是您可以通过在 Web 服务器上使用 cmdlet(netstat -aton | findstr "8081") 查看套接字状态。在您的 Web 服务器中,如果客户端请求的频率很高,则会导致很多 CLOSE_WAIT 套接字(social.technet.microsoft.com/Forums/ie/en-US/…)。所以你需要优化你的代码。
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2015-02-04
    • 2021-03-07
    • 2018-01-29
    • 2019-07-26
    相关资源
    最近更新 更多