我正在尝试通过多个站点从SharePoint Web传递大型(500-1000MB)文件。我的问题是整个文件最终都在内存中,这显然很糟糕。在请求500MB文件时,我发现整个系统的内存分配上升了1-1.5GB。
设置如下:
客户端从站点A 请求文件。 站点A 然后从站点B 请求此文件,该文件最后从SharePoint Web请求此文件。站点A和站点B上的相关方法实现为处理程序(.ASHX)。
ProcessRequest - 网站A
$0.74
ProcessRequest - 网站B
public void ProcessRequest(HttpContext context)
{
using (var client = new WebClient())
{
using(var stream = client.OpenRead( ... url to Site B ...)
{
if (stream != null)
{
... header setting emitted for clarity ...
stream.CopyTo(context.Response.OutputStream);
}
}
}
}
StreamDocumentFromSP - 网站B
public void ProcessRequest(HttpContext context)
{
using (var stream = Resolve<IDocumentService>().StreamDocumentFromSP( ... paramaters to get correct file ...))
{
if (stream != null)
stream.CopyTo(context.Response.OutputStream);
}
}
CopyTo从
public Stream StreamDocument(... paramaters to get correct file ...)
{
SPFile tempFile = null;
SPSecurity.RunWithElevatedPrivileges(() =>
{
using (var site = new SPSite(url))
{
using (var web = site.OpenWeb())
{
tempFile = web.GetFile(itemGuid);
}
}
});
return tempFile.OpenBinaryStream();
}
理想情况下,内存分配不应该比我的CopyTo方法中的buffersize增加更多。我怎样才能做到这一点?
答案 0 :(得分:0)
我最终通过在CopyTo方法中在每个周期后手动刷新输出流来解决我的问题。然后,在站点A和B的ProcessRequest中,我设置:
context.Response.BufferOutput = false
这就是诀窍。我不知道HTTPHandlers默认缓冲整个响应流。