WebHttpRequest在sharepoint文档库中的使用

写在前面

由于sharepoint服务器上的站点采用的域用户windows认证的方式登陆,而app项目虽然能够提供用户名和密码,但客户是不愿意在网络上这样传输的。所以给提供了使用ssl证书认证的方式。而webhttprequest和sharepoint的Client object model 的结合还是蛮靠谱的,这里将采用这两种方式,带上证书发送请求进行上传文件。

核心代码

 1         /// <summary>
 2         /// 上传文件
 3         /// </summary>
 4         /// <param name="serverReleativeUrl">文件夹的相对路径</param>
 5         /// <param name="fileName"></param>
 6         /// <returns></returns>
 7         public string UploadFile(string serverReleativeUrl, string fileName, byte[] data, bool bOverWrite)
 8         {
 9             if (data.Length == 0)
10             {
11                 return string.Empty.ToErrorJson("500", "不允许上传空文件");
12             }
13             if (string.IsNullOrEmpty(this._siteInfo.UserName))
14             {
15                 return string.Empty.ToErrorJson("500", new ArgumentNullException("用户名参数为空").Message);
16             }
17             ClientContext spContext = new ClientContext(this._siteInfo.AppUrl);
18             //spContext.Credentials = new NetworkCredential(this._userName, this._pwd, this.strDomain);
19             /*
20            * SSL 支持
21            * SSL 身份验证协议依赖于证书。.
22            * NET Framework 中对 SSL 的支持包含两个部分。
23            * HTTP 上的 SSL 这种特殊情况(但使用最为广泛)由 HttpWebRequest 类(它最终还可用于 Web 服务客户端代理)实现。
24            * 要启用 SSL,除了要指定一个使用 Https: 协议的 URL 外,不必执行任何特殊操作。
25            * 当连接到一个受 SSL 保护的终结点时,会在客户端上对服务器证书进行验证。
26            * 如果验证失败,连接会根据默认设置立即关闭。您可以回调一个名为 ServicePointManager 的类来重写该行为。
27            * 每当 HTTP 客户端的堆栈进行证书验证时,都会首先检查是否可以回调;
28            * 如果可以,则执行您的代码。要挂接该回调,您必须提供类型 RemoteCertificateValidationCallback 的一个委托:
29            */
30             ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(VerifyServerCertificate);
31
32             spContext.ExecutingWebRequest += spContext_ExecutingWebRequest;
33             Web website = spContext.Web;
34             Folder folder = website.GetFolderByServerRelativeUrl(serverReleativeUrl);
35             try
36             {
37                 FileCreationInformation file = new FileCreationInformation();
38                 file.Content = data;
39                 file.Url = fileName;
40                 file.Overwrite = bOverWrite;
41                 folder.Files.Add(file);
42                 spContext.ExecuteQuery();
43             }
44             catch (Exception ex)
45             {
46                 throw ex;
47             }
48
49             return string.Empty.ToSuccessJson("200", "上传成功");
50         }
51         /// <summary>
52         /// 在回调中,您会获得服务器证书、一个错误代码和一个传入的链对象,然后可以执行自己的检查并返回 true 或 false。
53         /// 如果出现诸如证书在开发或测试期间就已过期的情况,那么关闭其中某项检查是有好处的。另一方面,这样做还可以执行比默认更为严格的验证策略。
54         /// https://msdn.microsoft.com/zh-cn/magazine/cc163454.aspx#S6
55         /// </summary>
56         /// <param name="sender"></param>
57         /// <param name="certificate"></param>
58         /// <param name="chain"></param>
59         /// <param name="sslPolicyErrors"></param>
60         /// <returns></returns>
61         private bool VerifyServerCertificate(object sender, X509Certificate certificate,
62     X509Chain chain, SslPolicyErrors sslPolicyErrors)
63         {
64             if (sslPolicyErrors == SslPolicyErrors.None) return true;
65
66             foreach (X509ChainStatus s in chain.ChainStatus)
67             {
68                 // allows expired certificates
69                 if (string.Equals(s.Status.ToString(), "NotTimeValid",
70                     StringComparison.OrdinalIgnoreCase))
71                     return true;
72             }
73
74             return false;
75         }
76         void spContext_ExecutingWebRequest(object sender, WebRequestEventArgs e)
77         {
78             HttpWebRequest webReq = e.WebRequestExecutor.WebRequest;
79             #region 此种方式个人的能上传,团队的不能上传
80             //string pfxPath = ConfigurationManager.AppSettings["ClientSigningCertificatePath"];
81             //string pfxPassword = ConfigurationManager.AppSettings["ClientSigningCertificatePassword"];
82             //X509Certificate2 cert = new X509Certificate2(pfxPath, pfxPassword);
83             //webReq.Credentials = new NetworkCredential(this._userName, _pwd, strDomain);
84             //webReq.ClientCertificates.Add(cert);
85             #endregion
86             CheckAppExsit();
87             var accessToken = TokenHelper.GetS2SAccessTokenWithWindowsIdentity(new Uri(_siteInfo.AppUrl), null);
88             webReq.Method = "Post";
89             webReq.Accept = "application/json;odata=verbose";
90             webReq.Headers.Add("Authorization", "Bearer " + accessToken);
91         }

这种方式,可以直接使用证书进行认证,而不用提供账户信息。这里提供一下思路,希望对你有所帮助。

总结

在sharepoint中上传文件,采用Client object model是相对rest api更简单的一种方式,采用rest api,我是没有成功过,也不知道那地方出问题了,很是头疼,最后没办法,采用了这种方式。

参考文章:

http://blog.csdn.net/starlee/article/details/4441150

https://msdn.microsoft.com/zh-cn/magazine/cc163454.aspx#S6

http://www.cnblogs.com/dosboy/p/4045773.html

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/4438686.html
时间: 2024-11-01 08:25:30

WebHttpRequest在sharepoint文档库中的使用的相关文章

SharePoint 2013文档库中PPT转换PDF

通过使用 PowerPoint Automation Services,可以从 PowerPoint 二进制文件格式 (.ppt) 和 PowerPoint Open XML 文件格式 (.pptx) 转换为其他格式.例如,您可能需要将一批 PowerPoint 97–2003 文件升级到 Open XML 演示文稿文件.您还可以在"编辑"菜单中创建自定义操作,以允许用户按需创建 PDF 版本的演示文稿. 一.效果演示: 1.新建一个ppt文档(office 2013,后缀pptx),

SharePoint 2013 文档库中PPT转换PDF

原文:SharePoint 2013 文档库中PPT转换PDF 通过使用 PowerPoint Automation Services,可以从 PowerPoint 二进制文件格式 (.ppt) 和 PowerPoint Open XML 文件格式 (.pptx) 转换为其他格式.例如,您可能需要将一批 PowerPoint 97–2003 文件升级到 Open XML 演示文稿文件.您还可以在"编辑"菜单中创建自定义操作,以允许用户按需创建 PDF 版本的演示文稿. 一.效果演示:

在SHAREPOINT共享文档库中启用版本控制功能。

上海同事新要求,为了更方便和昆山及美国协同工作. 果断加上此功能, 还好,简单的实现,并不复杂. 微软推荐标准工作流程如下: http://office.microsoft.com/zh-cn/sharepoint-online-enterprise-help/HA101972543.aspx 导航到您计划在其中工作的库.如果库的名称没有显示在"快速启动"窗格中,请单击"所有网站内容",然后选择您的库的名称. 在功能区上的"库工具"组中,单击&q

如何使用SharePoint 2007文档库中的文档添加评论功能

背景:接到一个项目,要求文档管理,当然文档库就可以了,但是要求文档需要大家去读,读完以后还可以发表评论,这Moss貌似就有点困难了.和同事一起合计,想来想去也没有太好的办法,后来想到传统开发,两个表的级联,就想到了文档库和列表库通过一个字段进行级联,废话不多说了,进入正题. 1.首先,新建一个文档库,这不是废话么:然后,再建一个列表库用来保存文档的评论:当时我在想,对于一个文档什么才是唯一的,后来想到,这么简单,不就是ID么,又是废话了,呵呵.我们要做的就是通过文档库中文档的ID进行级联. 2.

SharePoint 2007 文档库中的文档添加评论功能

背景:接到一个项目,要求文档管理,当然文档库就可以了,但是要求文档需要大家去读,读完以后还可以发表评论,这Moss貌似就有点困难了.和同事一起合计,想来想去也没有太好的办法,后来想到传统开发,两个表的级联,就想到了文档库和列表库通过一个字段进行级联,废话不多说了,进入正题. 1. 首先,新建一个文档库,这不是废话么:然后,再建一个列表库用来保存文档的评论:当时我在想,对于一个文档什么才是唯一的,后来想到,这么简单,不就是ID么,又是废话了,呵呵.我们要做的就是通过文档库中文档的ID进行级联. 2

[sharepoint]rest api文档库文件上传,下载,拷贝,剪切,删除文件,创建文件夹,修改文件夹属性,删除文件夹,获取文档列表

写在前面 最近对文档库的知识点进行了整理,也就有了这篇文章,当时查找这些接口,并用在实践中,确实废了一些功夫,也为了让更多的人走更少的弯路. 系列文章 sharepoint环境安装过程中几点需要注意的地方 Rest API的简单应用 rest api方式实现对文档库的管理 通过WebClient模拟post上传文件到服务器 WebHttpRequest在sharepoint文档库中的使用 [sharepoint]Rest api相关知识(转) [sharepoint]根据用户名获取该用户的权限

SharePoint 2010 PowerShell学习 四 使用PowerShell管理文档库

使用PowerShell创建一个文档库 文档库的操作和操作的列表是类似的,在这一章将会介绍如果创建一个文档库,上传一个文件到文档库中 创建一个文档库,我们同样需要使用SPListCollection中的Add()方法, PS > $spWeb = Get-SPWeb -Identity http://SPServer PS > $listTemplate = [Microsoft.SharePoint.SPListTemplateType]::DocumentLibrary PS > $

SharePoint中一个文档库里面的文件数量不能超过2000吗

在SharePoint平台上的众多流言中,这一定是流传得最广的流言之一:不要在一个文档库中存放超过2000个的文件(对应到列表,可以被描述成:不要在一个列表中存放超过2000个列表项). 好吧,以下是一些供你参考的信息: 1.这里没有一个实际的硬性限制,所以用户的确可以在一个文档库中存放远远超过2000个的文件.一个拥有子文件夹的文档库(列表)可以存放500万个文件(列表项). 2.微软提供的最佳实践是:如果在一个文件夹下存放超过2000个文件(列表项),文件夹载入的性能将随着文件数量的增加而线

SharePoint更新文档库文档标题(Title)字段

前言:记录下写代码中遇到的小问题,帮同事写一个批量更新文档库标题字段的小程序,本来以为就Update一下就可以了,10分钟可以搞定.结果10分钟过去了,代码写好了,执行起来不报错,调试也没问题,只是要更新的东西没更新.然后问了下,文档库开启了签入签出(不判断会报错)和版本控制,找到问题所在了,Update是不行的. 1.废话不多说,上图和代码. SPFile file = listitemcoll[j].File; file.CheckOut(); file.Update(); file.Ite