【发布时间】:2015-02-09 19:28:09
【问题描述】:
我正在使用TIdHTTPServer 为客户提供文件,使用ResponseInfo->ServeFile 函数。这适用于“静态”文件:不是由其他进程写入的。据我从代码中可以看出,ServeFile 函数内部使用TIdReadFileExclusiveStream,这不允许我读取正在写入的文件,但我还需要能够发送正在由其他进程写入的文件。
所以,我自己创建了一个 FileStream 并使用 ContentStream 属性将其返回给客户端,但是我在客户端中得到了一个 0 字节的文件(对于任何文件,无论是否写入),我可以'看不到我错过了什么或做错了什么。这是我在OnCommandGet 事件处理程序上使用的代码:
AResponseInfo->ContentStream = new TFileStream(path, fmOpenRead | fmShareDenyNone);
AResponseInfo->ContentStream->Position = 0;
AResponseInfo->ContentLength = AResponseInfo->ContentStream->Size;
AResponseInfo->ResponseNo = 200;
AResponseInfo->WriteHeader();
AResponseInfo->WriteContent();
此时的 ContentLength 属性有一个有效值(即调用 ContentStream->Size 时的文件大小),这就是我想发送给客户端的值,即使文件在两者之间发生变化。
我已经尝试删除 WriteContent() 函数、WriteHeader(),但结果是一样的。我搜索了一些示例,但我发现的几个与此代码或多或少相同,所以我不知道出了什么问题。大多数示例不包括 WriteContent() 调用,这就是我尝试删除它们的原因,但似乎没有任何区别。
附带说明:正在写入的文件需要 24 小时才能完成写入,但这是客户端所期望的:我只需要在请求时已经写入的字节(甚至更少是有效的)。这些文件永远不会被删除:它们只会越来越大。
有什么想法吗?
更新
使用 Fiddler,我收到了一些与此相关的协议违规警告。例如,我得到:
Content-Length mismatch: Response Header indicated 111,628,288 bytes, but server sent 41 bytes
内容长度是正确的,它是文件大小,但我不知道我做错了什么导致应用程序只发送了 41 个字节。
【问题讨论】:
标签: delphi c++builder indy indy10 c++builder-xe5