通过多个站点中继文件流

时间:2017-01-31 08:14:11

标签: c# sharepoint memory-management stream

我正在尝试通过多个站点从SharePoint Web传递大型(500-1000MB)文件。我的问题是整个文件最终都在内存中,这显然很糟糕。在请求500MB文件时,我发现整个系统的内存分配上升了1-1.5GB。

设置如下:

Architecture

客户端从站点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增加更多。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

我最终通过在CopyTo方法中在每个周期后手动刷新输出流来解决我的问题。然后,在站点A和B的ProcessRequest中,我设置:

context.Response.BufferOutput = false

这就是诀窍。我不知道HTTPHandlers默认缓冲整个响应流。