所以我正在开发一个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吗?或者我需要做些什么让它起作用?
我是否需要在文件上设置任何特定的安全权限?