Sharepoint web service 下载大文档出错

isme2013 2013-03-28 11:38:08
朋友们好,我这里遇到了麻烦,希望得到大家的帮助。



我的需求是这样的,开发winform程序,程序中有个功能是下载SharePoint文档库中的文档。所以,毫无疑问,自然要用到SharePoint 的 web service来实现了,即Copy.asmx。



我的代码是这样的:


public static void CopyfileToLocal(string strSiteUrl,string strFileUrl, string strFilePath)
{
using (Copy copyFile = new Copy())
{
if (AdminNwc == null)
{
return;
}
copyFile.Credentials = AdminNwc;
copyFile.Url = strSiteUrl.Trim('/') + @"/_vti_bin/Copy.asmx";
FieldInformation fileInfo = new FieldInformation();

FieldInformation[] fileInfoArray = { fileInfo };
byte[] fileContents;
copyFile.GetItem(strFileUrl, out fileInfoArray, out fileContents);


}
}

(备注:这里关于创建Copy对象都有引用相应的命名空间)



以上代码在执行过程中,小文件都是没有问题的。但遇到了大文件就会抛异常,例如,下载一个180M的文件,里面出错:Exception of type 'System.OutOfMemoryException' was thrown.


请各位园友伸出援助之手。谢谢,不甚感激!
...全文
406 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
isme2013 2013-03-28
  • 打赏
  • 举报
回复
引用 1 楼 farawayplace613 的回复:
用Web service下载大文件肯定会内存溢出,试试:
//
// CopyStream is from 
// http://stackoverflow.com/questions/411592/how-do-i-save-a-stream-to-a-file
//
public static void CopyStream(Stream input, Stream output) { 
            byte[] buffer = new byte[8 * 1024]; 
            int len; 
            while ((len = input.Read(buffer, 0, buffer.Length)) > 0) { 
                output.Write(buffer, 0, len); 
            } 
        } 
 
        protected void Page_Load(object sender, EventArgs e)
        {
            string url = "https://myserver.com/test/Shared%20Documents/mypic.jpg";
            WebRequest request = WebRequest.Create(new Uri(url, UriKind.Absolute));
            request.UseDefaultCredentials = true;
            WebResponse response = request.GetResponse();
            Stream fs = response.GetResponseStream() as Stream;
            
            using (FileStream localfs = File.OpenWrite(@"c:\temp\aspdownloadedfile.jpg"))
            {
                CopyStream(fs, localfs);
            }
        }
因为我的是在winform中做的下载文档,所以不知道这种方法是否可行,先谢谢你,我现在去测试。
天涯海角 2013-03-28
  • 打赏
  • 举报
回复
用Web service下载大文件肯定会内存溢出,试试:
//
// CopyStream is from 
// http://stackoverflow.com/questions/411592/how-do-i-save-a-stream-to-a-file
//
public static void CopyStream(Stream input, Stream output) { 
            byte[] buffer = new byte[8 * 1024]; 
            int len; 
            while ((len = input.Read(buffer, 0, buffer.Length)) > 0) { 
                output.Write(buffer, 0, len); 
            } 
        } 
 
        protected void Page_Load(object sender, EventArgs e)
        {
            string url = "https://myserver.com/test/Shared%20Documents/mypic.jpg";
            WebRequest request = WebRequest.Create(new Uri(url, UriKind.Absolute));
            request.UseDefaultCredentials = true;
            WebResponse response = request.GetResponse();
            Stream fs = response.GetResponseStream() as Stream;
            
            using (FileStream localfs = File.OpenWrite(@"c:\temp\aspdownloadedfile.jpg"))
            {
                CopyStream(fs, localfs);
            }
        }
isme2013 2013-03-28
  • 打赏
  • 举报
回复
引用 1 楼 farawayplace613 的回复:
用Web service下载大文件肯定会内存溢出,试试: C# code?12345678910111213141516171819202122232425//// CopyStream is from // http://stackoverflow.com/questions/411592/how-do-i-save-a-stream-to-a-file//publi……
太棒了,问题解决了,谢谢你。。。。 我用blog记录了这个问题: http://www.cnblogs.com/qixing_gan/archive/2013/03/28/2986730.html
HTTPLook 是一个 HTTP 的嗅探器,它能捕捉本机与其它任何主机的 HTTP 通讯(不是 HTTPS 哦 ),然后显示详细的 HTTP 操作(如 GET/POST)、访问资源的 URL 、字节数大小等,这个软件简单易用,不用对 Internet Explorer 做任何其它设置(有的软件通过在 IE 中设置代理来监控数据),也不需要其它任何软件的支持,是一款较为绿色的、轻量级的软件。 HTTPLook 的应用场景: 1、程序开发及调试 在 CGI、ASP/PHP/JSP、ASP.NET、Web Service 的开发中,经常要查看 GET 或 POST 的数据是否正确,用这个工具能很好地协助完成此工作。 2、复杂页面分析 上网有时会碰到的很复杂的页面,查看源码也不能了解它的工作原理,这一般是作者为了保护 Web 在页面而加上了一些保护机制(如使用 Frame/IFrame、捕捉键盘或 Mouse 事件、使用 Script 来访问资源等),使用 HTTPLook 有助于对此页面进行分析,进而破解其保护机制。 比较典型的一个例子就是 SharePoint Team Services 中使用了 WebBot ,查看源码根本不知道它调用了那些 ASP/Script/CSS 文件,但使用 HTTPLook 之后,一目了然,非常有效,可以据此来自定义原有页面风格,如色彩,字体等。 3、获得被保护的 Web 资源 在很多网站上,尤其是 Microsoft 的网站上,经常见到一些制做精美的 Flash ,但是由于 Flash 不是一个单一文件,而是在最先启动的 FLASH 中再调用其它 Flash 资源文件,由于无法获得这些文件的 URL ,所以不能下载到本地,但如果使用 HTTPLook ,通过对整个播放过程的监视,就可以完全侦测出所有在程序中访问的资源的地址,进而保存到本地,可以离线浏览。当然也可以保存其它资源,如图片等。 4、学习 HTTP 协议 可以详细地了解 HTTP 通讯的细节,如 GET/POST、User-Agent、Cookie、Proxy 设置及验证、HTTP 协议出错代码及意义等。
HTTPLook 是一个 HTTP 的嗅探器,它能捕捉本机与其它任何主机的 HTTP 通讯(不是 HTTPS 哦 ),然后显示详细的 HTTP 操作(如 GET/POST)、访问资源的 URL 、字节数大小等,这个软件简单易用,不用对 Internet Explorer 做任何其它设置(有的软件通过在 IE 中设置代理来监控数据),也不需要其它任何软件的支持,是一款较为绿色的、轻量级的软件。 HTTPLook 的应用场景: 1、程序开发及调试 在 CGI、ASP/PHP/JSP、ASP.NET、Web Service 的开发中,经常要查看 GET 或 POST 的数据是否正确,用这个工具能很好地协助完成此工作。 2、复杂页面分析 上网有时会碰到的很复杂的页面,查看源码也不能了解它的工作原理,这一般是作者为了保护 Web 在页面而加上了一些保护机制(如使用 Frame/IFrame、捕捉键盘或 Mouse 事件、使用 Script 来访问资源等),使用 HTTPLook 有助于对此页面进行分析,进而破解其保护机制。 比较典型的一个例子就是 SharePoint Team Services 中使用了 WebBot ,查看源码根本不知道它调用了那些 ASP/Script/CSS 文件,但使用 HTTPLook 之后,一目了然,非常有效,可以据此来自定义原有页面风格,如色彩,字体等。 3、获得被保护的 Web 资源 在很多网站上,尤其是 Microsoft 的网站上,经常见到一些制做精美的 Flash ,但是由于 Flash 不是一个单一文件,而是在最先启动的 FLASH 中再调用其它 Flash 资源文件,由于无法获得这些文件的 URL ,所以不能下载到本地,但如果使用 HTTPLook ,通过对整个播放过程的监视,就可以完全侦测出所有在程序中访问的资源的地址,进而保存到本地,可以离线浏览。当然也可以保存其它资源,如图片等。 4、学习 HTTP 协议 可以详细地了解 HTTP 通讯的细节,如 GET/POST、User-Agent、Cookie、Proxy 设置及验证、HTTP 协议出错代码及意义等。

3,244

社区成员

发帖
与我相关
我的任务
社区描述
企业开发 SharePoint
社区管理员
  • SharePoint社区
  • 霖雨 - LinyuLoveTJ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧