【发布时间】: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),它并不总是有效。但它有时会起作用!???我不知道怎么了?
【问题讨论】:
-
您需要增加 WCF 服务消息大小。 stackoverflow.com/questions/884235/…
-
你可以在上面的示例中看到,我已经这样做了
标签: c# wcf sharepoint