http_listener cpprestsdk如何处理多个POST请求

时间:2017-05-04 22:21:15

标签: c++11 visual-studio-2013 client-server httplistener cpprest-sdk

我使用casablanca cpprestskd开发了一个客户端服务器应用程序。 客户端每5分钟通过POST方法将任务管理器(进程,cpu使用等)的信息发送到服务器。

该项目应该能够管理大约100个客户。 每次该服务器收到POST请求时,他都会打开一个输出文件流(" uploaded.txt"),从客户端提取一些初始信息(登录,密码),管理此信息,将所有信息保存在一个文件中在附加模式下,客户端的名称相同(例如:client1.txt,client2.txt),最后使用状态代码回复客户端。 这基本上是来自服务器端的POST句柄代码:

void Server::handle_post(http_request request)
{

auto fileBuffer = 
     std::make_shared<Concurrency::streams::basic_ostream<uint8_t>>();
try
{
    auto stream = concurrency::streams::fstream::open_ostream(
        U("uploaded.txt"),
        std::ios_base::out | std::ios_base::binary).then([request, fileBuffer](pplx::task<Concurrency::streams::basic_ostream<unsigned char>> Previous_task)
    {

        *fileBuffer = Previous_task.get();
        try
        {
            request.body().read_to_end(fileBuffer->streambuf()).get();
        }
        catch (const exception&)
        {
            wcout << L"<exception>" << std::endl;
            //return pplx::task_from_result();
        }
        //Previous_task.get().close();

    }).then([=](pplx::task<void> Previous_task)
    {


        fileBuffer->close();
        //Previous_task.get();
    }).then([](task<void> previousTask)
    {
        // This continuation is run because it is value-based.
        try
        {
            // The call to task::get rethrows the exception.

            previousTask.get();
        }
        catch (const exception& e)
        {
            wcout << e.what() << endl;
        }
    });
    //stream.get().close();
}
catch (const exception& e)
{
    wcout << e.what() << endl;
}


ManageClient();

request.reply(status_codes::OK, U("Hello, World!")).then([](pplx::task<void> t) { handle_error(t); });
return;

}

基本上它可以工作,但如果我尝试同时从应有的客户端发送信息,有时它有时会起作用。 显然是问题,如果我打开&#34; uploaded.txt&#34;流文件。 问题:

1)CASABLANCA http_listener真的是多任务吗?它能处理多少任务? 2)我没有在文档中找到类似于我的例子,唯一一个接近我的人就是&#34; Casalence120&#34;项目,但他使用Concurrency :: Reader_writer_lock类(它似乎是一个互斥方法)。 我该怎么做才能管理多个POST? 3)在开始upload.txt之前是否可以读取一些客户端信息? 我可以直接用客户端的名称打开输出文件流。 4)如果我通过upload.txt文件上的互斥锁锁定访问,服务器将成为顺序,我认为这不是一个使用cpprestsdk的好方法。 我还在接近cpprestskd,所以任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:2)

  1. 是的,REST sdk处理不同线程上的每个请求
  2. 我确认使用监听器的例子不多。 使用监听器的官方示例可以在这里找到: https://github.com/Microsoft/cpprestsdk/blob/master/Release/samples/CasaLens/casalens.cpp
  3. 我看到你正在与VS合作。我强烈建议转到VC ++ 2015或更好的VC ++ 2017,因为最新的编译器支持协同例程。 使用co_await可以大大简化代码的可读性。 基本上每次你都在使用&#39; co_await&#39;一个函数,编译器将在&#34; continuation&#34;中重构代码。避免惩罚冻结执行函数本身的线程。这样,你摆脱了&#34; .then&#34;语句。
  4. 文件问题与REST sdk不同。同时访问文件系统是您应该在单独的项目中测试的内容。您可以缓存第一次读取并与其他线程共享内容,而不是每次都访问磁盘。
相关问题