SharePoint2010 为我们提供了丰富的客户端API(Client Object Model:COM),我们可以在客户端调用"COM” 来访问SharePoint数据,但是在Silverlight或者是javascript访问"COM”的时候,所有的调用都是异步的,也就是说当我的逻辑很复杂的时候,可能涉及到多次的异步调用才能够完成需要的功能,这时候我们就应该考虑建一个自定义的后台处理层来完成复杂的操作,将结果一次返回给前端,有多种选择可以做,比如建立自定义WebService,创建Httphandler等等,如果功能不是很复杂,我们可以选择使用自定义Httphandler来完成,下面介绍下步骤:
1. 在Visual studio2010中创建一个empty SharePoint Project。
2. 选择Add –> Add “SharePoint Layout Mapped Folder”。
3. 在加入的Layout folder下可以建立自定义的folder,如demoHandler folder,部署是会自动部署到"\14\TEMPLATE\LAYOUTS”下。
4. 在demoHandler下我们可以添加httphandler文件了,注意SharePoint project下并不能通过add new item来添加一个ASHX文件,所以你可以先建一个Web Application Project, 在这个project中添加ASHX文件,也就是Generic handler项,然后将其Copy至demoHandler下。
5. 我们添加了demoHandler后,打开.ASHX文件,添加对Microsoft.SharePoint.dll的引用,在ASHX中加入
1: <%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
为了方便起见,我们用inline-code的模式,删除.ashx.cs文件,在.ashx中加入
1: <%@ WebHandler Language="C#" Class="YourHandler" %>
1: using System;
2: using System.Collections.Generic;
3: using System.Text;
4: using System.Web;
5: using Microsoft.SharePoint;
6: using System.Text.RegularExpressions;
7:
8: public class YourHandler : IHttpHandler {
9: public bool IsReusable
10: {
11: get { return false; }
12: }
13:
14: public void ProcessRequest(HttpContext context)
15: {
16: SPSite siteColl = SPContext.Current.Site;
17: SPWeb site = SPContext.Current.Web;
18: SPList evaluationList = site.Lists["ListName"];
19: //
20: //Get date from several list and do any thing you want
21: //
22: JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
23: IList<YourTemplateClass> result = new List<EvaluationReportEntity>();
24: String json = jsSerializer.Serialize(result);
25: context.Response.Clear();
26: context.Response.ContentType = "application/json";
27: context.Response.Write(json);
28: context.Response.End();
29: }
30:
31: }
Httphandler 只为我们提供了一个处理方法ProcessRequest,当有request过来时,会调用此方法,这就是和WebService不同的地方,webservice支持多个方法调用,不过对于某些需求来讲,这样轻量级的处理也足够支持了。编译部署,将.ashx部署到某个site下(创建Project时选择的那个site)。
6. Silverlight 访问HttpHandler,获取数据
1: WebClient client = new WebClient();
2: client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
3: client.OpenReadAsync(serviceUri);
在回调方法client_OpenReadCompleted中可以获取ashx处理完传过来的Json格式的数据
1: void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
2: {
3: JsonArray questionMonthlyEntity = (JsonArray)JsonArray.Load(e.Result);
4: }
这样就完成了Silverght 获取SharePoint中自定义httphandler返回结果的过程。