即使设置了keepAlive,POCO请求超时

时间:2014-08-01 05:30:43

标签: httprequest session-timeout poco-libraries

我使用简单的Get请求从服务器获取通知。我希望请求持续到服务器收到响应(可能是1到9个小时)。但我面临2分钟内请求超时的问题。我将会话和请求设置为" keepalive"。但它没有帮助。我也尝试过使用setKeepAliveTimeout并给它一个很大的值。但这也没有改变任何东西。以下是我正在使用的代码:

try{
        //Prepare request
        Poco::URI uri(url);
        const Poco::Net::Context::Ptr context = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "", "", "", Poco::Net::Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
        Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort(), context);
        session.setKeepAlive(true);

        // prepare path
        std::string path(uri.getPathAndQuery());
        if (path.empty())
        {
            path = "/";
        }

        // send request
        Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, path, Poco::Net::HTTPMessage::HTTP_1_1);
      req.setKeepAlive(true);
        session.sendRequest(req);

        // Get response
        Poco::Net::HTTPResponse res;

        //Get status code
     statusCode = res.getStatus());
        //Get status
        status = res.getReason();

        //Get body
        std::istream &inStream = session.receiveResponse(res);
        std::ostringstream outStringStream;
        outStringStream << inStream.rdbuf();
        response = outStringStream.str();
    }
    catch(Poco::Exception& exception)
    {
       cout<<exception.displayText();
    }

请让我知道我哪里错了。感谢。

我在大约2分钟内获得状态-1超时。

2 个答案:

答案 0 :(得分:6)

这个问题现在有些陈旧,但我有答案,我花了一些时间才找到它。

这不是您想要更改的keepAlive设置,因为这只会保持请求之间的连接打开。

您提出请求后

session.sendRequest(req);

(即,一旦建立了会话的底层套接字),获取会话的套接字引用并更改接收超时,即:

StreamSocket &str = session.socket();
// Create a timespan of (e.g.) 600 secs (10 mins)
Timespan ts(600L, 0L);
str.setReceiveTimeout(ts);

这对我有用!

答案 1 :(得分:2)

在处理Google Pub / Sub pull机制时,在搜索相同的TimeOut问题时发现了这个问题。

发现您可以设置会话超时:

session->sendRequest(request)

必须在var qry: TfdQuery; FieldsObj: TJSONObject; FieldNameArray: TJSONArray; I: Integer; DataObj: TJSONObject; DataRows: TJSONArray; RowFields: TJSONArray; tablename:string; begin tablename:='produkt'; qry := TfdQuery.Create(Self); qry.SQL.Text := 'select * from produkt where (id ='''+ProductID+''')'; qry.Connection := FDConnection1; qry.Open; FieldsObj := TJSONObject.Create; FieldNameArray := TJSONArray.Create; for I := 0 to qry.FieldCount - 1 do FieldNameArray.Add(qry.Fields[I].FieldName); FieldsObj.AddPair(TableName, FieldNameArray); DataObj := TJSONObject.Create; DataRows := TJSONArray.Create; qry.First; while not qry.Eof do begin RowFields := TJSONArray.Create; for I := 0 to qry.FieldCount - 1 do RowFields.Add(qry.Fields[I].AsString); DataRows.Add(RowFields); qry.Next; end; DataObj.AddPair('data', DataRows); Result := TJSONArray.Create(FieldsObj, DataObj); qry.Free; 之前调用。