【问题标题】:Poco::Net::NoMessageException raised few seconds after HTTP/GETPoco::Net::NoMessageException 在 HTTP/GET 后几秒钟引发
【发布时间】:2016-06-07 16:25:26
【问题描述】:

与 POCO GitHub 问题重复

我正在 Windows 10 上使用 Poco 和 Visual Studio 2015 构建一个简单的 Web 服务器。

Poco::Net::NoMessageException 在使用 Web 浏览器连接到此服务器后几秒钟(大约 15 秒)引发。刷新页面后会再次出现;每次连接后都会这样做。

我没有在文档、论坛、stackoverflow 中找到任何内容。在文档中描述这些来自库深处的异常是如何/何时/为什么被引发的,这将非常有帮助。

我还尝试(只是为了好玩)handleRequest(...) 中的std::cout << req.getURI() << std::endl; 并在地址 0x00000000 处遇到 内存访问冲突,而函数中没有其他代码。

这是我的代码。 预处理器语句被省略。

MyApp.c

int main(int argc, char ** argv)
{
    myHTTPServer server;
    return server.run(argc, argv);
}

myHTTPRequestHandlerFactory

// Header
class myHTTPRequestHandlerFactory : public HTTPRequestHandlerFactory
{
    public:
        virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest&);
};

// Code
HTTPRequestHandler* myHTTPRequestHandlerFactory::createRequestHandler(const HTTPServerRequest& handler) {
    return new myHTTPRequestHandler;
}

myHTTPRequestHandler

// Header
class myHTTPRequestHandler : public HTTPRequestHandler
{
    public:
        virtual void handleRequest(HTTPServerRequest &, HTTPServerResponse &);
};

// Code
void myHTTPRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response) {
    response.setStatus(HTTPResponse::HTTP_OK);
    //response.setContentLength(1024);
    //response.setChunkedTransferEncoding(true);
    std::ostream& out = response.send();
    out << "<html><head></head><body>POCO POCO POCO</body></html>";
    out.flush();
}

myHTTPServer

// Header
class myHTTPServer : public ServerApplication
{
    protected:
        int main(const std::vector<std::string>& v) {
            HTTPServer server(new myHTTPRequestHandlerFactory, ServerSocket(80), new HTTPServerParams);

            server.start();

            std::cout << "Server started" << std::endl;

            waitForTerminationRequest();

            std::cout << "Server stopped" << std::endl;

            server.stop();

            return Application::EXIT_OK;
        }
};

// No code in .c file

谢谢你帮助我

【问题讨论】:

    标签: c++ windows visual-studio-2015 poco-libraries


    【解决方案1】:

    根据this answer,无特殊原因引发Poco::Net::NoMessageException异常是正常的POCO行为,您应该safely ignore它们。

    对于内存访问冲突,这是正常的,因为在HTTPRequestHandler::handleRequest(...)中不允许调用std::cout。

    【讨论】:

      【解决方案2】:

      在更改处理 URL 路由的方式后,我也面临同样的问题。

      我认为这可能是由于Chrome 自动发送的第二个请求:图标。 在接收到 HTML 内容后,浏览器会再次询问服务器以获取精美的选项卡图标(如果有)。确保您优雅地处理此类请求,如果需要,会出现 404 错误。

      作为一般建议,将所有未知请求重定向到发送相关 HTTP 错误代码的处理程序,以确保您回复所有请求。

      您还可以记录所有传入请求(至少在调试中,如果您不想记录敏感信息)并检查浏览器的“开发者工具”部分以检查发送了哪些请求。 如果您没有在 http 服务器上调用以 https:// 开头的 URL(在这种情况下,可能会发生额外的交换),您的浏览器不应在未将其登录到网络选项卡的情况下发送任何其他请求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多