IIS7本机模块 - 设置具有文件句柄的请求实体

时间:2012-01-04 05:46:44

标签: c++ iis-7

所以我正在开发一个IIS7本机模块,它将做的部分工作是处理一些相当大的上传文件。我正在努力研究减少模块内存占用的方法。

我能用处理过的响应数据做的一件好事就是通过使用HttpDataChunkFromFileHandle块类型将打开的文件句柄传递给底层系统而不是内存缓冲区。我正在尝试对请求数据做同样的事情,但到目前为止还没有快乐。

我正在做的是首先我正在读取所有请求数据,处理它,然后在原始HTTP_REQUEST中设置实体块,如下所示:

HTTP_REQUEST* rawRequest = _context->GetRequest()->GetRawHttpRequest(); 
rawRequest->EntityChunkCount = 1; 
rawRequest->pEntityChunks = new HTTP_DATA_CHUNK[1];

rawRequest->pEntityChunks[0].DataChunkType = HttpDataChunkFromFileHandle;
rawRequest->pEntityChunks[0].FromFileHandle.FileHandle = _requestFile.handle(); 

rawRequest->pEntityChunks[0].FromFileHandle.ByteRange.StartingOffset.QuadPart = 0; 
rawRequest->pEntityChunks[0].FromFileHandle.ByteRange.Length.QuadPart = _requestFile.size();

并返回RQ_NOTIFICATION_CONTINUE。

这会导致服务器发出403响应。

如果我使用内存块,它可以正常工作:

char* bufferOut = static_cast<char*>(_context->AllocateRequestMemory( _requestFile.size() ));
std::memcpy( bufferOut, _requestFile.map( 0, _requestFile.size() ), _requestFile.size() );


HTTP_REQUEST* rawRequest = _context->GetRequest()->GetRawHttpRequest();
rawRequest->EntityChunkCount = 1;
rawRequest->pEntityChunks = new HTTP_DATA_CHUNK[1];

rawRequest->pEntityChunks[0].DataChunkType = HttpDataChunkFromMemory;

rawRequest->pEntityChunks[0].FromMemory.pBuffer = (PVOID)bufferOut;
rawRequest->pEntityChunks[0].FromMemory.BufferLength = _requestFile.size()

所以......请问实体不支持HttpDataChunkFromFileHandle吗?或者我需要做些什么让它起作用?

我是否需要在文件上设置任何特定的安全权限?

0 个答案:

没有答案