SharePoint 2013 APP 开发示例 (三)使用远程的web资源
在这个示例里我们将详细介绍 TokenHelper 类, 我们将看到它是怎么简单地从远程web站点访问SharePoint的。我们还将取到它的一些值。这将帮助我们理解连接是怎么被构造的,同时也方便我们的以一的调试。我们将创建一个简单的 auto-hosted app,用TokenHelper类从相关的SharePoint服务器读取数据,并显示在页面上。我们还将取出一些token的值以方便看到它们的内容。
1. 打开Visual Studio 2012.
2. 创建一个新的 C# SharePoint app 项目:RemoteWebApp。
3. 选择 Autohosted (它是缺省项).
这将生成二个projects. 第一个是 SharePoint app web, 第二个是远程web站点。当debug时,远程的web app 将运行在本地的IIS Express上。当通过
remote web site. When debugging, the remote web app will run on a local copy of IIS Express. When deployed
Office Store 或一个 App 目录,远程的web将被发布到 Azure 云。
4. 按F5运行app
这个页面将查询host web 站咪的title,并显示在页面上。它只用了几行就做到了,因为它使用了TokenHelper 这个类。我们下面将详细介绍它的使用。
5. 停止调试
6. 打开Default.aspx.cs
7. 注释Page_Load() 里已有的代码
8. 加入下面的引用:
using Microsoft.IdentityModel.S2S.Protocols.OAuth2; using Microsoft.SharePoint.Client; using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.Linq; using System.Web; using System.Web.Configuration; using System.Web.UI; using System.Web.UI.WebControls;
9. 加入下面的代码到Page_Load() :
// Get app info from web.configstring clientID = string.IsNullOrEmpty(WebConfigurationManager.AppSettings.Get("ClientId"))? WebConfigurationManager.AppSettings.Get("HostedAppName"): WebConfigurationManager.AppSettings.Get("ClientId");string clientSecret = string.IsNullOrEmpty(WebConfigurationManager.AppSettings.Get("ClientSecret"))? WebConfigurationManager.AppSettings.Get("HostedAppSigningKey"): WebConfigurationManager.AppSettings.Get("ClientSecret");
client ID 和 secret 是从远程web的配置文件读取到的,ID 指向 app, secret 被用作获取 access tokens。
10. 加入下面的代码到Page_Load() :
// Get values from Page.Requeststring reqAuthority = Request.Url.Authority;string hostWeb = Page.Request["SPHostUrl"];string hostWebAuthority = (new Uri(hostWeb)).Authority;
11. 加入下面的代码到Page_Load() :
// Get Context Tokenstring contextTokenStr = TokenHelper.GetContextTokenFromRequest(Request);SharePointContextToken contextToken =TokenHelper.ReadAndValidateContextToken(contextTokenStr, reqAuthority);// Read data from the Context Tokenstring targetPrincipalName = contextToken.TargetPrincipalName;string cacheKey = contextToken.CacheKey;string refreshTokenStr = contextToken.RefreshToken;string realm = contextToken.Realm;
SharePoint 还将传递encode context token, ReadAndValidateContextToken() 方法把它转换成一个 SharePointContextToken 对象,这样就更容易访问它的内容, 验证这个token指的是验证它的地址是来自这个app。剩下的代码就是从token里取出一些值.
12. 把这下面这个方法加到 Default 页面.
private static string GetFormattedPrincipal(string principalName, string hostName, string realm){if (!String.IsNullOrEmpty(hostName)){return String.Format(CultureInfo.InvariantCulture, "{0}/{1}@{2}", principalName, hostName, realm);}else{return String.Format(CultureInfo.InvariantCulture, "{0}@{1}", principalName, realm);}}
13. 加入下面的代码到Page_Load() :
// Create principal and client stringsstring targetPrincipal = GetFormattedPrincipal(targetPrincipalName, hostWebAuthority, realm);string appPrincipal = GetFormattedPrincipal(clientID, null, realm);
app principal 哪个app正在做请求; target principal 确认哪个application, host 和 realm 将收到请求。
14. 加入下面的代码到Page_Load() :
// Request an access token from ACSstring stsUrl = TokenHelper.AcsMetadataParser.GetStsUrl(realm);OAuth2AccessTokenRequest oauth2Request =OAuth2MessageFactory.CreateAccessTokenRequestWithRefreshToken(appPrincipal, clientSecret, refreshTokenStr, targetPrincipal);OAuth2S2SClient client = new OAuth2S2SClient();OAuth2AccessTokenResponse oauth2Response = client.Issue(stsUrl, oauth2Request) as OAuth2AccessTokenResponse;string accessTokenStr = oauth2Response.AccessToken;
这是连接回到host web的关键, 这段代码请求 OAuth access token 并把它送到 Access Control Service (ACS). ACS发布了 access token 并且把它返回到远程的。这里能用同步调用,因为在服务端而不是在sharepoint。
15. 加入下面的代码到Page_Load() :
// Build the CSOM context with the access tokenClientContext clientContext = TokenHelper.GetClientContextWithAccessToken(hostWeb, accessTokenStr);clientContext.Load(clientContext.Web, web => web.Title);clientContext.ExecuteQuery();
这里我们用access token创建一个CSOM client context 去请求 sharepoint . 我们这里用同步的ExecuteQuery(),因为这是服务端的代码。
16. 加入下面的代码到Page_Load() 显示数据 :
// Dump values to the pageDataTable dt = new DataTable();dt.Columns.Add("Name");dt.Columns.Add("Value");dt.Rows.Add("QueryString", Request.QueryString);dt.Rows.Add("clientID", clientID);dt.Rows.Add("clientSecret", clientSecret);dt.Rows.Add("hostWeb", hostWeb);dt.Rows.Add("contextTokenStr", contextTokenStr);dt.Rows.Add("contextToken", contextToken);dt.Rows.Add("targetPrincipalName", targetPrincipalName);dt.Rows.Add("cacheKey", cacheKey);dt.Rows.Add("refreshTokenStr", refreshTokenStr);dt.Rows.Add("realm", realm);dt.Rows.Add("targetPrincipal", targetPrincipal);dt.Rows.Add("appPrincipal", appPrincipal);dt.Rows.Add("stsUrl", stsUrl);dt.Rows.Add("oauth2Request", oauth2Request);dt.Rows.Add("client", client);dt.Rows.Add("oauth2Response", oauth2Response);dt.Rows.Add("accessTokenStr", accessTokenStr);dt.Rows.Add("Host Web Title", clientContext.Web.Title);grd.DataSource = dt;grd.DataBind();
17. 打开Default.aspx 页面.
18. 加入下面的GridView :
<asp:GridView ID="grd" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="True" Width="100%"><AlternatingRowStyle BackColor="White" /><EditRowStyle BackColor="#2461BF" /><FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /><HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /><PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /><RowStyle BackColor="#EFF3FB" /><SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /><SortedAscendingCellStyle BackColor="#F5F7FB" /><SortedAscendingHeaderStyle BackColor="#6D95E1" /><SortedDescendingCellStyle BackColor="#E9EBEF" /><SortedDescendingHeaderStyle BackColor="#4870BE" /></asp:GridView>
19. 按 F5 运行APP.
这个app显示了远程站点的 default 页面,显示了这个站点的token的值。这些值让我们更方便地调试我们的app。
SharePoint 2013 APP 开发示例 系列
SharePoint 2013 APP 开发示例 (三)使用远程的web资源相关推荐
- SharePoint 2013 APP 开发示例 系列
SharePoint 2013 APP 安全: SharePoint 2013 APP 开发示例 (一)List 读写 SharePoint 2013 APP 开发示例 (二)获取用户信息 Share ...
- SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)
上个示例(SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API))是基于JavaScript,运行在web browser内去访问REST AP ...
- SharePoint 2013 APP 开发示例 (二)获取用户信息
这个示例里,我们将演示如何获取用户信息: 1. 打开 Visual Studio 2012. 2. 创建一个新的 SharePoint 2013 app: UserProfileTest. 3. 选 ...
- SharePoint 2013 App Remote Event Receivers
当我们在使用App的时候,就会发现一些问题,比如那些网站部署.更新或者卸载了,我们很关心我们的App是否有人用,这就需要远程事件接收器了. 1.在我们的测试App的解决方案上选中鼠标,按F4弹出属性, ...
- SharePoint 2013常用开发工具分享
众所周知,一款好的开发工具不仅能提高项目开发效率,而且能够协助开发人员简化开发流程.本文汇总几款SharePoint 2013开发常用开发工具,希望能够对大家有所帮助.如果您有更好的工具,没有包含在本 ...
- SharePoint 2013 本地开发解决方案以及程调试
SharePoint 2013 本地开发解决方案以及程调试 在SharePoint开发中,我们需要在部署有SharePoint环境的服务器中开发,这是一件让人很苦恼的事情,毕竟不能一个项目多人开发配备 ...
- SharePoint 2013 图文开发系列之自定义字段
原文:SharePoint 2013 图文开发系列之自定义字段 SharePoint使用的优势,就在于开箱即用.快速搭建,SharePoint自身为我们提供了很多字段类型,已经很丰富了.但是,在实际应 ...
- SharePoint 2013 App Development读书笔记1
传统的Farm部署方式有一些缺点,例如运行在SharePoint环境中的自定义代码会带来安全隐患.自定义代码很多时候要提升权限来做一些事情,虽然解决了权限不够的问题,但是有带来了权限过大的问题,这个问 ...
- Android App 开发的三种姿势 ~
点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达 现在市场上各式各样的App越来越多,其实设计一个App也没有那么难,这期就讲解一下安卓开 ...
最新文章
- 总结 | 2020年TOP 10计算机视觉论文:代码,解读,还有demo视频!
- PHP反射ReflectionClass、ReflectionMethod 入门教程
- 深入理解分布式技术 - 探究缓存穿透、缓存击穿、缓存雪崩解决方案
- 全球及中国教育信息化行业投资模式与发展建议咨询报告2022版
- 客户端相关知识学习(四)之H5页面如何嵌套到APP中
- java 画图板源代码_非常值得学习的java 绘图板源代码
- 工作250:uniapp--实战--flex布局--星级评分
- linux内核那些事之ZONE
- virtualbox 网络配置
- mysql数据库产生的背景_MySql路途之mysql背景
- 单一世界十万在线webgame的设计思路(五)-- 整体架构和总结
- 几张图来好好理解Spring的循环依赖
- html快闪软件制作,教你如何用PPT轻松完成快闪视频制作?
- 3.30华为笔试第三题
- python 2.7导入arcpy_导入 ArcPy
- 将vscode打造成无敌的IDE(5)打造shell IDE--三大神器
- Global Shutter(全局快门)与Rolling Shutter(卷帘快门)的区别与比较
- 柳传志退休:激荡三十五年
- 国赛培训——最优化智能算法——模拟退火
- 博思特POSITAL编码器OCD58-CA1212-B15V-H3P
热门文章
- 学习旧岛小程序 (4)封装api 请求
- java word转html 报错 org/apache/poi/xwpf/usermodel/IRunBody
- [总结]vue开发常见知识点及问题资料整理(持续更新)
- 电磁学讲义2:库仑定律
- Hive与Hbase结合使用
- [Spring MVC] - JSP + Freemarker视图解释器整合
- android.database.cursorindexoutofboundsexception错误解决 及获取某行某列信息
- java get post 区别详解_[Java教程]GET 与 POST 其实没有什么区别
- 函数不可访问_C++之访问控制与继承
- 【Matlab 控制】仿真多智体一致性分析,附代码