Poco::Net::NoMessageException 在 HTTP/GET 几秒后提出
Poco::Net::NoMessageException raised few seconds after HTTP/GET
从 POCO GitHub 问题中复制
我正在使用 Poco 和 Visual Studio 2015 在 [= 上构建一个简单的网络服务器63=]10.
A Poco::Net::NoMessageException 在使用网络浏览器连接到此服务器后几秒钟(约 15 秒)出现。刷新页面后会再次发生;它在每次连接后都这样做。
我在文档、论坛、Whosebug 中没有找到任何内容。在文档中描述 how/when/why 这些来自库内部深处的异常会非常有帮助。
我也试过(只是为了好玩)在 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
谢谢你帮助我
我遇到了同样的问题,就在我改变处理 URLs 路由的方式之后。
我认为这可能是由于 Chrome 自动发送的第二个请求:图标。
在收到 HTML 内容后,浏览器立即再次询问服务器以获取精美的选项卡图标(如果有)。确保您优雅地处理此类请求,并在需要时处理 404 错误。
作为一般建议,将所有未知请求重定向到发送相关 HTTP 错误代码的处理程序,以确保您回复所有请求。
您还可以记录所有传入的请求(至少在调试中,如果您不想记录敏感信息)并查看浏览器的“开发者工具”部分以检查发送了哪些请求。
如果您没有在 http 服务器上调用以 https:// 开头的 URL(在这种情况下可能会发生额外的交换),您的浏览器不应发送任何其他请求而不在网络选项卡中记录它。
根据 this answer,引发 Poco::Net::NoMessageException 异常是正常的 POCO 行为,您应该 safely ignore
他们。
对于内存访问冲突,这是正常的,因为不允许在HTTPRequestHandler::handleRequest(...)
中调用std::cout
。
从 POCO GitHub 问题中复制
我正在使用 Poco 和 Visual Studio 2015 在 [= 上构建一个简单的网络服务器63=]10.
A Poco::Net::NoMessageException 在使用网络浏览器连接到此服务器后几秒钟(约 15 秒)出现。刷新页面后会再次发生;它在每次连接后都这样做。
我在文档、论坛、Whosebug 中没有找到任何内容。在文档中描述 how/when/why 这些来自库内部深处的异常会非常有帮助。
我也试过(只是为了好玩)在 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
谢谢你帮助我
我遇到了同样的问题,就在我改变处理 URLs 路由的方式之后。
我认为这可能是由于 Chrome 自动发送的第二个请求:图标。 在收到 HTML 内容后,浏览器立即再次询问服务器以获取精美的选项卡图标(如果有)。确保您优雅地处理此类请求,并在需要时处理 404 错误。
作为一般建议,将所有未知请求重定向到发送相关 HTTP 错误代码的处理程序,以确保您回复所有请求。
您还可以记录所有传入的请求(至少在调试中,如果您不想记录敏感信息)并查看浏览器的“开发者工具”部分以检查发送了哪些请求。 如果您没有在 http 服务器上调用以 https:// 开头的 URL(在这种情况下可能会发生额外的交换),您的浏览器不应发送任何其他请求而不在网络选项卡中记录它。
根据 this answer,引发 Poco::Net::NoMessageException 异常是正常的 POCO 行为,您应该 safely ignore
他们。
对于内存访问冲突,这是正常的,因为不允许在HTTPRequestHandler::handleRequest(...)
中调用std::cout
。