【问题标题】:Transfer big files with WCF service to sharepoint webpart使用 WCF 服务将大文件传输到 sharepoint webpart
【发布时间】:2014-10-28 16:46:27
【问题描述】:

场景:客户端 (SharePoint Webpart) 应向用户提供下载。由于安全原因,我无法直接从 SharePoint Webpart 访问该文件。所以我创建了一个 wcf webservice,它将文件作为流发送。但这不适用于更大的文件。

WCF Webservice 发送方法:

public Stream GetFileStream(string filePath)
{
        WebClient client = new WebClient();
        return client.OpenRead(filePath);
}

客户端(SharePoint Webpart)获取流并将其转换为字节[],以便我可以在浏览器中创建下载。

private void SendFileToBrowser(string filePath)
    {
        Page.Response.Clear();
        Page.Response.ClearContent();
        Page.Response.ClearHeaders();
        Page.Response.ContentType = "application/pdf";
        Page.Response.AddHeader("Content-Disposition", string.Format("attachment; fileName=\"{0}\"", Path.GetFileName(filePath)));
        Page.Response.AddHeader("Accept-Ranges", "bytes");

        byte[] buffer;

        CustomBinding binding = new CustomBinding();
        BinaryMessageEncodingBindingElement binaryMsg = new BinaryMessageEncodingBindingElement();
        binaryMsg.ReaderQuotas.MaxDepth = 2147483647;
        binaryMsg.ReaderQuotas.MaxStringContentLength = 2147483647;
        binaryMsg.ReaderQuotas.MaxArrayLength = 2147483647;
        binaryMsg.ReaderQuotas.MaxBytesPerRead = 2147483647;
        binaryMsg.ReaderQuotas.MaxNameTableCharCount = 2147483647;
        binding.Elements.Add(binaryMsg);

        HttpTransportBindingElement transportBinding = new HttpTransportBindingElement();
        transportBinding.TransferMode = TransferMode.Streamed;
        transportBinding.MaxReceivedMessageSize = 2147483647;
        binding.Elements.Add(transportBinding);

        EndpointAddress endPoint = new EndpointAddress ("http://xxx/fileservice.svc");
        FileServiceClient fileServiceProxy = new FileServiceClient(binding, endPoint);

        // Stream
        Stream stream = fileServiceProxy.GetFileStream(filePath);

        fileServiceProxy.Close();

        // convert stream to byte[]
        using (var memoryStream = new MemoryStream())
        {
            stream.CopyTo(memoryStream);
            buffer = memoryStream.ToArray();
        }

        if (buffer != null)
        {
            Page.Response.BinaryWrite(buffer);
        }

        Page.Response.Flush();
        Page.Response.Close();
        Page.Response.End();
    }

如果文件小于 300kb,则该代码有效。但如果文件更大(例如 50mb),它并不总是有效。但它有时会起作用!???我不知道怎么了?

【问题讨论】:

标签: c# wcf sharepoint


【解决方案1】:

经过一些测试,我在最后取消了以下 2 行的注释。现在它正在工作。

    Page.Response.Flush();
    //Page.Response.Close();
    //Page.Response.End();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多