12
SharePoint 2007与WCF和Silverlight
新闻News
No tags
本文将说明一个构建Silverlight前端到SharePoint功能的例子。Silverlight控制将在SharePoint背景中工作,而且让你从受限的Silverlight CLR中访问SharePoint对象模式。整篇文章中,我将说明具体的开发步骤——是让在SharePoint中的Rich UIs开发变得很简单的步骤。让我们首先从定义问题开始吧。
问题定义
我发现SharePoint中的日历表是非常有用的。在本文中,我将创建一个显示我今天约会记录的Silverlight UI,而且保留在当前用户背景之下。
为了达到此目的,我需要编写:
一个Silverlight .xap 文件。我需要用Visual Studio 2008 SP1(带有Silverlight 安装工具)来进行工作,而且还要有Expression Blend 2 SP1来制作这个UI。
一个WCF服务。该服务将在环境下工作,在当前登陆用户的安全环境下查看约会记录。Silverlight UI将使用basicHttpBinding来消耗服务。
一个contract 。这个contract指定Silverlight应用程序如何与WCF对话。这个与WCF contract是相同的。
第一步是要定义WCF contract,如下显示:
| [ServiceContract] public interface IAppointments
{ [OperationContract] List GetAppointments(); } |
在以上的代码中,BO.Appointment是一个自定义business object定义如下:
| [DataContract] public class Appointment
{ [DataMember] public DateTime AppointmentTime { get; set; } [DataMember] public string Title { get; set; } } |
Contract 定义后,你可以在其周围编写剩下的东西。
.NET 3.5开发模式的好处就是只要你解决了contract问题,你可以完全采用Sharepoint,除此之外还有:
模拟机
附加W3WP.exe的程序
讨厌的GAC DLL版本,它的breakpoint似乎总是难以得到。
我将简单的在我的Vista开发机上进行该项目,如Figure 1所示:

我创建了该项目如Figure 1所示,通过使用Visual Studio 2008 SP1的Silverlight工具,和我添加到项目上的WCF service l库。如你所见,MyServices class 库是一个WCF service 库,在执行先前定义的contract的Appointments.cs中主持一个服务。因为你尚未在SharePoint中运行,你可以消除不存在的约会,如下显示:
| public List< BO.Appointment> GetAppointments() {
List< BO.Appointment> toReturnAppts = new List< BO.Appointment>(); toReturnAppts.Add(new BO.Appointment { Title = “First Appointment”, AppointmentTime = DateTime.Now }); toReturnAppts.Add(new BO.Appointment { Title = “Second Appointment”, AppointmentTime = DateTime.Now }); toReturnAppts.Add(new BO.Appointment { Title = “Third Appointment”, AppointmentTime = DateTime.Now }); return toReturnAppts; } |
以上代码很简洁,因为他使用叫做”Object and Collection Initializers”的概念。它是在C#3.0中所采用的。
接下来,我要开始创建我的Silverlight应用程序的UI了。我需要一个可以绑定WCF service 调用结果的UI。
| < ListBox x:Name=”UserAppointments” ItemTemplate=”{StaticResource ShowTime}”>
< /ListBox> |
”ShowTime”静态资源是一个作为资源定义的DataTemplate:
| < DataTemplate x:Key=”ShowTime”> < StackPanel Margin=”10″>
< ContentControl Template= “{StaticResource clockTemplate}” Width=”120″ Height=”108″ DataContext= ”{Binding Path=AppointmentTime}”/> < TextBlock Text=”{Binding Path=Title}” HorizontalAlignment=”Center”/> < /StackPanel> < /DataTemplate> |
指向 StaticResource的ContentControl是另一个程序级资源——它只是一个采用DataTime的ControlTemplate并且显示一个好看的模拟时钟。你可以下载时钟ControlTemplate的代码(download the source code for the clock ControlTemplate)。
就这样,UI已经完成(而且真的很简单)。现在,你需要将一些数据放入其中,这样你可以看到它是如何运行的。
Silverlight UI通过使用basicHttpBinding从WCF service中得到它的数据。为了做到这一点,你需要添加一个 WCF service reference(add a WCF service reference)到Silverlight程序中。
添加reference之后,你可以使用WCF 服务代理来获得约会的数据,并且把这些约会绑定到Silverlight UI中(参见Listing 1)。

C#
Listing 1. Code-Behind for the Silverlight Application:
这个代码调用WCF service来获得指定用户的约会表。
| public partial class Page : UserControl {
public Page() { InitializeComponent(); EndpointAddress endPointAddress = new EndpointAddress( ”http://localhost:52178/WCF/Service1.svc”); BasicHttpBinding basicHttpBinding = new BasicHttpBinding(); AppointmentsClient client = new AppointmentsClient( basicHttpBinding, endPointAddress); client.GetAppointmentsAsync(); client.GetAppointmentsCompleted += new EventHandler< GetAppointmentsCompletedEventArgs>( client_GetAppointmentsCompleted); } void client_GetAppointmentsCompleted( object sender, GetAppointmentsCompletedEventArgs e) { UserAppointments.ItemsSource = e.Result; } }
|
在Listing 1中值得注意的重要事情是你必须异步的一直从Silverlight UIs中调用WCF 服务。如果不这样做会锁住浏览器——你的终端用户会不高兴的!
当你编译并运行以上程序的时候,你将看到像Figure 2一样的UI。
你可能已将注意到我还没有涉及到SharePoint。从技术上讲,整个的程序已经通过一个非SharePoint开发者进行开发了。但是,在这一点上,UI和WCF service骨架已经完成了,你可以使用SharePoint.
进入SharePoint:编写WCF Service
起初,你看到一些stub code代替WCF service——创建适合测试UI的模拟对象。要在SharePoint中进行此项工作,你只需要两个简单的步骤:
你需要配置SharePoint来支持WCF,你可以通过使用在www.codeplex.com/SPWCFSupport.中找的的功能来实现。
你还需要编辑WCF service代码在现有登录用户的安全背景下提取真实的约会记录。换句话说,你需要一个真实的提取记录(遵守当前登陆用户的安全环境)的WCF service代替你起初看到的假的WCF service。
由于第一步如果你遵循链接,就是不言自明的,所以在本文中我将侧重于第二步。这个关键语就是”obeying the currently logged in user’s security context.”(遵守当前登陆用户的安全环境)。
现在,你可以从SharePoint中完全运行WCF service,而且这样与你的Silverlight应用程序相比是在不同的域上。但是在种情况下你必须设置一个跨域政策允许跨域调用进行工作。如果你在相同域的SharePoint中主持WCF service,你就不用担心了。
默认情况下,WCF在ASP.NET之外工作,同样也在SharePoint之外工作。这是合理的,因为WCF的范围要比ASP.NET的大得多。但是WCF没有ASP.NET的兼容方式,可以让一个WCF service获得HttpContext.Current和SPContext.Current的reference。
所以,让我们直接来到这里:在MacOS/Safari上运行的一个漂亮的Silverlight UI现在能够与在Sharepoint对象模式中完全参与的WCF service对话,使用现有的Sharepoint环境,并且现有的安全环境——也没有部署的问题!这比在糖果店一个没有家长陪同的5岁孩子走向警察时还要兴奋。
有了现有的环境在手和一点SPQuery 魔法,我修改了WCF service执行代码如下显示:
| [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class Appointments : IAppointments { #region IAppointments Members public List< BO.Appointment> GetAppointments() { List< BO.Appointment> toReturnAppts = new List< BO.Appointment>(); SPWeb web = SPContext.Current.Site.OpenWeb(); SPList appointmentsList = web.Lists["Appointments"]; SPListItemCollection items = appointmentsList.GetItems( new SPQuery( appointmentsList.Views["Current Events"])); IEnumerable< BO.Appointment> todaysAppts = from item in items.OfType< SPListItem>() select new BO.Appointment { Title = item[3].ToString(), AppointmentTime = Convert.ToDateTime(item["Start Time"]) }; toReturnAppts.AddRange(todaysAppts); return toReturnAppts; } #endregion } |
然后我更新了相关的Sharepoint地址的端点地址并重新构建.xap文件,它是我将放在Sharepoint .wsp解决方案包中的文件,所以我可以连同其他文件一起部署。
在Sharepoint中部署一切事情
让我把这个小节变得更简单些。你可以部署任何事情作为一个解决方案,但是创建解决方案的最简单方法就是WSPBuilder。这里是高级别部分的部署:
WCF service作为解决方案(在这里描述的here)的一部分进行部署。注意的是在这种情况下WCF Service 需要ASP.NET兼容模式下运行。
同样的解决方案通过使用在相关的elements.xml 中的< Module>标签,在文件库中部署.xap文件。你还可以部署.xap作为你希望的一个实际文件。
最后,相同的解决方法hiatus可以部署一个应用程序页面,并且为它创建一个自定义功能菜单。
总之,来自WSPBuilder的class 库创建一个解决方案如Figure 3所示:

该图表显示在部署的Silverlight+WCF解决方案中的文件….
当你启用这些功能时,并且浏览程序网页的时候,你将会看到运行在浏览器中的Silverlight应用程序,带有完全访问Sharepoint环境的权利,在现有的登录用户的安全环境下,在一个漂亮的UI中(参看Figure 4)。

虽然这个例子显示了运行在一个Sharepoint应用程序页面中的Silverlight应用程序,它可以很容易的在一个Web Part中运行,或是其他的。
本文演示了.NET 3.5 开发模式如何简化Sharepoint 开发,让平台比以往的等具有吸引力。这个项目的大部分是在Sharepoint以外开发的,并且逐步部署到Sharepoint,现在已经完成了。这个有以下一些显著的优势:
一个很好的开发经验。我在虚拟机以外做过很多困难的开发,在Vista OS上运行Sharepoint。
充分利用人才。你有能力合理规划并利用你团队的不同的技术,而不是找一个精通所有Silverlight,Sharepoint和WCF,等等的超级英雄——要有一个合理的价格。
模块化代码。开发的代码是模块化得。基于SOA构架确保这个程序不会影响其他的。
支持良好的开发做法。这个模式让你遵循稳固的开发做法,例如有效的源控制和有效的单元测试。
可维护的结果。最后,也是最重要的,制作一个模块化的解决方案意味着你的产品需要较少的努力去编写,更多的努力去维护。当你最后一次将这两个优势连在一起时在什么时候?
No comments yet.
Leave a comment
« Microsoft Expression offer in UK 40% off | Pineapple upside-down chart [How to: Invert the axis of a chart for "smaller is better" scenarios] »
