上个示例(SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API))是基于JavaScript,运行在web browser内去访问REST API;在这个示例里,我们将用服务端代码创建同样的功能,我们将用到TokenHelper和HTTPWebRequest 对象。

• 项目模板里的TokenHelper.cs 文件被用作管理Token
• HttpWebRequest 对象被用来格式化和发送请求
• HttpWebResponse 对象用于解释来自REST API的响应

我们将同样的创建一个 auto-hosted app 和 ASP.NET 控件,然后我们将添加服务端的代码去请求REST并显示结果。
1. 打开Visual Studio 2012.
2. 创建一个新的SharePoint 2013 app.
3. 选择auto-hosted .
4. 打开Default.aspx (Pages 文件夹).
5. 替换<form>里的内容:

<asp:HiddenField ID="SPAppToken" runat="server" />

    <div>
<table>
<tr>
<td>REST Path:</td>
<td>
<asp:TextBox ID="txtREST" runat="server" Width="700">/_api/web/lists</asp:TextBox>
</td>
</tr>
<tr>
<td>Format:</td>
<td>
<asp:DropDownList ID="ddlFormat" runat="server">
<asp:ListItem Value="application/json;odata=verbose">application/json;odata=verbose</asp:ListItem>
<asp:ListItem Value="application/atom-xml">application/atom-xml</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
</table>
<asp:Button ID="cmdRunRequest" runat="server" Text="Execute the REST Request" OnClick="cmdRunRequest_Click" />
</div> <h2><asp:Label ID="lblStatus" runat="server" Text=""></asp:Label></h2>
<asp:Label ID="lblOutput" runat="server" Text=""></asp:Label>

跟上个示例一样的UI,不同的是这里用的是ASP.NET 服务端控件,点击按钮后将引起ASP.NET postback 发生。

<asp:HiddenField ID="SPAppToken" runat="server" />

这是个隐藏字段,它包含这个页面的 context token ,我们加入这个字段是因为当postback发生时我们调用SharePoint时要用到它。另一种方法是,我们可以把context token放到 session 里,这就看你怎么平衡了,放到session里,可能会引起扩展性的问题;如果页面没有用到SSL,这时把它放到页面里可能会被拦截。本例的页面将要用到SSL,所以把token放到页面上是合适的。实际上这个token是以同样的方式post回来的。

6. 保存 Default.aspx.

7. 打开 Default.aspx.cs .

8. 加入下面的引用:

using System.Net;
using System.IO;

9. 加入下面代码到Page_Load 里,这段代码为form提供了context token.

if (!IsPostBack)
SPAppToken.Value = TokenHelper.GetContextTokenFromRequest(Request);

10. 为按钮添加click事件:

protected void cmdRunRequest_Click(object sender, EventArgs e)
{
// For testing only!
// Remove this line before releasing to production.
TokenHelper.TrustAllCertificates(); Uri appWebUrl = new Uri(Request.QueryString["SPAppWebUrl"]); // The context token is retreived from the SPAppToken field
// in TokenHelper.GetContextTokenFromRequest().
SharePointContextToken contextToken =
TokenHelper.ReadAndValidateContextToken(
TokenHelper.GetContextTokenFromRequest(Request),
Request.Url.Authority); string accessToken =
TokenHelper.GetAccessToken(contextToken, appWebUrl.Authority).AccessToken; HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(Request.QueryString["SPAppWebUrl"] + txtREST.Text);
req.Method = "GET";
req.Accept = ddlFormat.SelectedValue;
req.Headers.Add("Authorization", "Bearer " + accessToken); HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
lblStatus.Text = resp.StatusDescription; StreamReader st = new StreamReader(resp.GetResponseStream());
lblOutput.Text = WebUtility.HtmlEncode(st.ReadToEnd());
}

11. 保存Default.aspx.cs .

这段代码用一系列的步骤去请求REST,首先,获得 context token ,然后通过调用Windows Azure里的 Access Control Service生成access token:

SharePointContextToken contextToken =
TokenHelper.ReadAndValidateContextToken(
TokenHelper.GetContextTokenFromRequest(Request),
Request.Url.Authority); string accessToken =
TokenHelper.GetAccessToken(contextToken, appWebUrl.Authority).AccessToken;

接着,用URL和要求的header信息创建请求对象,注意把通过ACS生成的access token加到授权header里了。

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(Request.QueryString["SPAppWebUrl"] + txtREST.Text);
req.Method = "GET";
req.Accept = ddlFormat.SelectedValue;
req.Headers.Add("Authorization", "Bearer " + accessToken);

最后,执行这个请求获得响应:

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
lblStatus.Text = resp.StatusDescription; StreamReader st = new StreamReader(resp.GetResponseStream());
lblOutput.Text = WebUtility.HtmlEncode(st.ReadToEnd());

就像我们在上个示例看到的一样,如果现在去run solution,会报错,因为没有app web,为了强制创建一个最小的app web, 我们还是加一个空的element 文件到项目里。

12. 右击app项目.

13. 选择 Add ➤ New Item….

14. 从Office/SharePoint里选择Empty Element,接着点击Add,至于文件名不重要,随便填。

15. 按F5 debug.

结果跟上个示例一样,不同的是在本例中,点击按钮引起browser去发送一个新的请求到服务器端web browser,然后返回整个页面,客户端的web browser没有任何逻辑。

 

SharePoint 2013 APP 开发示例 系列

SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)的更多相关文章

  1. SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)

          虽然 JQuery 也能通过授权header实现跨域, 但SharePoint 提供了更简单的方法,它被实现在SP.RequestExecutor里 .它能访问跨域的服务包括REST AP ...

  2. SharePoint 2013 APP 开发示例 (三)使用远程的web资源

    在这个示例里我们将详细介绍 TokenHelper 类, 我们将看到它是怎么简单地从远程web站点访问SharePoint的.我们还将取到它的一些值.这将帮助我们理解连接是怎么被构造的,同时也方便我们 ...

  3. SharePoint 2013 APP 开发示例 系列

    SharePoint 2013 APP 安全: SharePoint 2013 APP 开发示例 (一)List 读写 SharePoint 2013 APP 开发示例 (二)获取用户信息 Share ...

  4. SharePoint 2013 APP 开发示例 (二)获取用户信息

    SharePoint 2013 APP 开发示例 (二)获取用户信息 这个示例里,我们将演示如何获取用户信息: 1. 打开 Visual Studio 2012. 2. 创建一个新的  SharePo ...

  5. SharePoint 2013 APP 开发示例 (四)JQuery访问REST

    这个示例里,我们将用JQuery AJAX去发送一个 REST请求,并查看返回结果.为了让我们更好地理解REST 接口,我们将添加一个输入框让用户可以指定REST的URL, 这将让我们尝试着用构造的U ...

  6. SharePoint 2013 APP 开发示例 (一)List 读写

    在这个示例里,我们将创建一个页面测试 SharePoint APP的权限.这个页面有二个按钮,一个从documents里读数据,一个往documents里写数据: 1. 打开Visual Studio ...

  7. spring boot / cloud (六) 开启CORS跨域访问

    spring boot / cloud (六) 开启CORS跨域访问 前言 什么是CORS? Cross-origin resource sharing(跨域资源共享),是一个W3C标准,它允许你向一 ...

  8. Nginx作为静态资源web服务之跨域访问

    Nginx作为静态资源web服务之跨域访问 首先了解一下什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相 ...

  9. SharePoint 2013 App 开发—App开发概述

    基于安全性的考虑,SharePoint App 不能像其它两种方式一样,直接使用安全性更高的服务端代码的API.Javascript 扮演极为重要的角色,在SharePoint App中与ShareP ...

随机推荐

  1. odoo在底部显示指定字段合计和汇总时显示合计

    1.odoo的tree视图底部显示合计 tree 视图,底部显示指定字段合计数 ,视图中字段定义上在sum,取自sale.view_order_tree 销售订单 tree 视图 <field ...

  2. 来不及说什么了,Python 运维开发剁手价仅剩最后 2 天

    51reboot 运维开发又双叒叕的搞活动了—— Python 运维开发 18 天训练营课程, 剁手价1299 最后2天 上课方式:网络直播/面授(仅限北京) DAY1 - DAY4 Python3 ...

  3. Awesome Python,Python的框架集合

    Awesome Python A curated list of awesome Python frameworks, libraries and software. Inspired by awes ...

  4. xmlSpy套件(Altova MissionKit 2016)的Ollydbg调试过程及破解

    最近工作需要用到XML处理软件,网上找到Altova MissionKit 2016( 包含了XmlSpy.MapForce.StyleVision.UModel.DatabaseSpy等工具),用了 ...

  5. 初学习Qt的一些感悟

    最近用Qt写了个人项目,有如下心得(可能有不准确): Qt尽管没有扩展C++语法,但是有额外编译链,每个Q_OBJECT类编译的时候会用moc工具生成另一个meta C++类,之后就是标准C++编译流 ...

  6. 结对项目——Core设计与实现

    写在前面:关于结对编程 结对编程我一直认为是一种非常好的合作方式,他的形式主要是由一个人负责代码编写,另一个人则在一旁即时对写下的代码进行审查,这样可以大大减少代码实现方面的错误. 这次我的结对伙伴是 ...

  7. 第七周 linux如何装载和启动一个可执行文件

    潘恒 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验内容 1.预处理. ...

  8. QT 窗口置顶功能

    Qt中,保持窗口置顶的设置为: Qt::WindowFlags m_flags = windowFlags(); setWindowFlags(m_flags | Qt::WindowStaysOnT ...

  9. APP推广(预期方案)

    首先,在推广过程中有一些定的弊端:我们这个O2O平台暂时只能适用于学校局域网. 因为我们的APP才刚刚“出炉”不久,在网络上还是属于一篇空白的状态,我们想过可以在百度百科上进行相应的推广,如果有用户搜 ...

  10. MySQL存储和获取数据

    ---恢复内容开始--- 一.MySQL存储引擎? 1.引擎定义 存储引擎其实就是如何存取数据,如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系型数据苦中数据是以表格的形式,所 ...