写在前面

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

核心代码

         /// <summary>
/// 上传文件
/// </summary>
/// <param name="serverReleativeUrl">文件夹的相对路径</param>
/// <param name="fileName"></param>
/// <returns></returns>
public string UploadFile(string serverReleativeUrl, string fileName, byte[] data, bool bOverWrite)
{
if (data.Length == )
{
return string.Empty.ToErrorJson("", "不允许上传空文件");
}
if (string.IsNullOrEmpty(this._siteInfo.UserName))
{
return string.Empty.ToErrorJson("", new ArgumentNullException("用户名参数为空").Message);
}
ClientContext spContext = new ClientContext(this._siteInfo.AppUrl);
//spContext.Credentials = new NetworkCredential(this._userName, this._pwd, this.strDomain);
/*
* SSL 支持
* SSL 身份验证协议依赖于证书。.
* NET Framework 中对 SSL 的支持包含两个部分。
* HTTP 上的 SSL 这种特殊情况(但使用最为广泛)由 HttpWebRequest 类(它最终还可用于 Web 服务客户端代理)实现。
* 要启用 SSL,除了要指定一个使用 Https: 协议的 URL 外,不必执行任何特殊操作。
* 当连接到一个受 SSL 保护的终结点时,会在客户端上对服务器证书进行验证。
* 如果验证失败,连接会根据默认设置立即关闭。您可以回调一个名为 ServicePointManager 的类来重写该行为。
* 每当 HTTP 客户端的堆栈进行证书验证时,都会首先检查是否可以回调;
* 如果可以,则执行您的代码。要挂接该回调,您必须提供类型 RemoteCertificateValidationCallback 的一个委托:
*/
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(VerifyServerCertificate); spContext.ExecutingWebRequest += spContext_ExecutingWebRequest;
Web website = spContext.Web;
Folder folder = website.GetFolderByServerRelativeUrl(serverReleativeUrl);
try
{
FileCreationInformation file = new FileCreationInformation();
file.Content = data;
file.Url = fileName;
file.Overwrite = bOverWrite;
folder.Files.Add(file);
spContext.ExecuteQuery();
}
catch (Exception ex)
{
throw ex;
} return string.Empty.ToSuccessJson("", "上传成功");
}
/// <summary>
/// 在回调中,您会获得服务器证书、一个错误代码和一个传入的链对象,然后可以执行自己的检查并返回 true 或 false。
/// 如果出现诸如证书在开发或测试期间就已过期的情况,那么关闭其中某项检查是有好处的。另一方面,这样做还可以执行比默认更为严格的验证策略。
/// https://msdn.microsoft.com/zh-cn/magazine/cc163454.aspx#S6
/// </summary>
/// <param name="sender"></param>
/// <param name="certificate"></param>
/// <param name="chain"></param>
/// <param name="sslPolicyErrors"></param>
/// <returns></returns>
private bool VerifyServerCertificate(object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None) return true; foreach (X509ChainStatus s in chain.ChainStatus)
{
// allows expired certificates
if (string.Equals(s.Status.ToString(), "NotTimeValid",
StringComparison.OrdinalIgnoreCase))
return true;
} return false;
}
void spContext_ExecutingWebRequest(object sender, WebRequestEventArgs e)
{
HttpWebRequest webReq = e.WebRequestExecutor.WebRequest;
#region 此种方式个人的能上传,团队的不能上传
//string pfxPath = ConfigurationManager.AppSettings["ClientSigningCertificatePath"];
//string pfxPassword = ConfigurationManager.AppSettings["ClientSigningCertificatePassword"];
//X509Certificate2 cert = new X509Certificate2(pfxPath, pfxPassword);
//webReq.Credentials = new NetworkCredential(this._userName, _pwd, strDomain);
//webReq.ClientCertificates.Add(cert);
#endregion
CheckAppExsit();
var accessToken = TokenHelper.GetS2SAccessTokenWithWindowsIdentity(new Uri(_siteInfo.AppUrl), null);
webReq.Method = "Post";
webReq.Accept = "application/json;odata=verbose";
webReq.Headers.Add("Authorization", "Bearer " + accessToken);
}

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

总结

在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

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

  1. sharepoint文档库中日期显示详细日期,不显示几天前

    文档库---库设置----栏

  2. CAML获取SharePoint文档库中除文件夹外所有文档

    方法一: <QueryOptions> <ViewAttributes Scope="Recursive" /> </QueryOptions> ...

  3. 在Outlook中查看预览SharePoint文档库的文档

    本文概况 阅读时间: 约2分钟 适用版本:SharePoint Server 2010及以上 面向用户:普通用户,管理员 难度指数:★★☆☆☆ 在日常工作中,总有一些常用的文档需要经常打开查看,其实我 ...

  4. 修改Sharepoint 文档库列表点击Excel文件默认跳转到Excel Service服务 xlviewer.aspx页面

    在Sharepoint 文档库中,当点击库中的一个Excel文件时,Sharepoint默认为转跳到Excel Services上,无论是Sharepoint 的是否开启了Excel Service, ...

  5. SharePoint 2013 文档库中PPT转换PDF

    通过使用 PowerPoint Automation Services,可以从 PowerPoint 二进制文件格式 (.ppt) 和 PowerPoint Open XML 文件格式 (.pptx) ...

  6. SharePoint文档库,如何在新窗口打开中的文件

    默认情况下,点击文档库中的文件是在当前浏览器中打开的(如果你设置的是在客户端软件打开,则不符合本文情况).那么如果让他在新窗口中打开呢? 这里需要借助jQuery,关于如何将jQuery集成到Shar ...

  7. SharePoint 2010遍历文档库中所有的文件,文件夹

    转:http://hi.baidu.com/sygwin/item/f99600849d51a12b110ef3eb 创建一个可视WebPart,并拖放一个label控件到ascx文件上,用于显示结果 ...

  8. SharePoint文档库文件夹特殊字符转义

    当我们在SharePoint网站文档库中新建文件夹时包含了~ " # % & * : < > ? / \ { | }字符时(一共15个), 或者以.开头或者结束,或者包含 ...

  9. 解决SharePoint文档库文件在搜索结果页面显示的标题和文档的标题不一致问题(search result)

    问题表现: SharePoint 2013 爬网后,搜索一个文档,虽然搜到了,但是显示有点问题,如图: 原因分析: 造成该问题的原因是,该文档除了本身有一个名称外,在文档metadata的title属 ...

随机推荐

  1. 把旧系统迁移到.Net Core 2.0 日记 (19) --UI转用adminLTE

    之前用JEasyUI,它的datagrid比较强大,但region的布局界面就太简陋了. 把布局界面改成adminLTE 左边菜单要做成动态,从xml文件加载, 可以参考NOPCommerce的源码来 ...

  2. 分布式系统定时任务,保证只有一个服务执行了改任务--采用redis分布式锁来实现(文章摘自:https://www.cnblogs.com/0201zcr/p/5942748.html)

    文章摘自:https://www.cnblogs.com/0201zcr/p/5942748.html package com.abtc.server.mine.common.utils; impor ...

  3. OC关于项目里面的代码统计次数

    备注:这里只是个人的观点,有的地方也是copy,多多指教,个人笔记,有侵犯你们版权的地方还望海涵!!! 1.打开终端 2.cd 进入项目根目录 3.输入命令 find . "(" ...

  4. css.aa

    出的不同(面是必考) 因为浏览器在解析第二个p的时候,因为字母之间没有空格,他会以为是是一个单词所以不会换行. 列表 1.无序列表ul 第一内部必须含有子标签<li></li> ...

  5. wpf-x命名空间-Markup Extension(标记扩展)

    1.x:type 用于前端类型声明 与C#  代码 Type类似 2.x:Null 代表Null 某些时候需要显示的为一些值设置为空   前端为 x:Null   C# 中 为 Null 3.x:ar ...

  6. L2-014. 列车调度(set)*

    L2-014. 列车调度 参考博客 #include <iostream> #include <cstdio> #include <set> #include &l ...

  7. 我在MySQL免安装版使用过程中遇到的问题记录

    我的MySQL版本为:mysql-5.7.16-winx64 安装时间为:2016年5月10号 由于是免安装版,下载好压缩文件之后解压到特定目录下,再打开命令行运行几行命令即可. 在一次操作中,发现无 ...

  8. libnids-1.24 使用源码问题

    从网上下载libnids-1.24源码包,解压后./configure安装. 会出现提示 checking for GLIB... configure: error: Package requirem ...

  9. 《JavaScript 设计模式与开发实战》第一部分(1、2、3章)笔记

    第1章:面向对象的JavaScript 动态类型和鸭子类型 编程语言按照数据类型大体可以分为两类: ① 静态类型语言:在编译时便已确定变量的类型. ② 动态类型语言:变量类型要到程序运行的时候,待变量 ...

  10. 帝国cms自动保存图片

    <?=ECMS_ShowEditorVar("newstext",$ecmsfirstpost==1?"":stripSlashes($r[newstex ...