2009年1月19日星期一

让SharePoint的WebPart连接外部数据库

关键字:MOSS 2007, WebPart, 数据库
摘要:本文主要介绍如何使WebPart能读取外部数据库的数据。

应用场景

正如MSDN所说的那样,WebPart是一个很好的扩展SharePoint功能的机制。它可以被安放于任何一个Web Part Page页。现在很少有应用是离开数据库的,因此使用WebPart连接外部数据库也是一个很常用的技巧。

MOSS 2007中引用了BDC机制,可以通过配置使SharePoint与外部数据进行交互,如SAP和CRM等。但是,只使用BDC是不能完成所有的需求的,比如购物车这样的功能。

现在有这样一个应用场景:某生成零件的公司使用SharePoint来开发一个网上零件订购系统。客户可以通过网上浏览所有可选的零部件,然后有选择的购买。这就是很普通的购物车的功能。这个公司同时还使用SAP作为企业的ERP,因此零部件和订购信息等部分来自SAP。但是,在本系统的设计中,我们创建了一个单独的数据库作为SAP数据的中转站,而不是全部与SAP进行直接的交互。这样做的好处在于:一方面可以使用这个数据库作一个缓存(因为直接与SAP通过Web Service进行交互,肯定效率上有所降低);另外也更安全(可以有选择的将数据导入中间数据库)。

设计分析

本项目中使用Web Part作一些关键业务逻辑的开发:比如购物车(My basket)的功能。My basket用于存放当前用户选购的零部件,当用户确认购买后就生成订单。那么我们使用Web Part来实现购物车的界面。零件的显示直接使用BDC List,然后在其Action中加入一个新的跳转地址,如:http://demosite:1010/MyBasket/PartID=xxxxxx。整个购物站点是一个Site Collection,而MyBasket是一个Site。然后在MyBaset的首页上填加一个MyBasket的WebPart即可。

那么这个MyBasket就是关键的功能模块了。

MyBasket需要连接B机的SQL Server 2005数据库,获取购物车数据。我使用一个单独的Class Library作为Model类和数据库类,它会生成一个DLL文件,只需将它放置在bin目录中即可。购物车的结构如下图所示。


更改代码访问权限

但当我将MyBasket这个web part发布至SharePoint站点时,出现了下方的错误信息:
请求 System.Data.SqlClient.SqlClientPermission, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 类型的权限已失败。
解决办法是:
最简便的方法是:更改web.config中的Trust Level至WSS_Medium。代码如下:
<trust level="WSS_Medium" originurl=""></trust>
<trust>是IIS的配置文件的一个标签,用于指定代码访问安全级别,详细内容可参考下面的网址:http://doc.51windows.net/iismmc/?url=/iismmc/htm/aacontrustelement.htm。

还有另外一种方法:因为web.config默认的trust level是Minimal(最小),它载入的是一个web_minimaltrust.config配置文件。 我们只需要将SqlClientPermission加入最小权限中就可以了,下面是具体的操作,不过我不推荐这种方法

首先在C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\CONFIG中找到wss_mediumtrust.config文件,找到其中的两部分代码:
<securityclass name="SqlClientPermission" description="System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> </securityclass>
<securityclass name="SqlClientPermission" description="System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
</securityclass>
将这两部分分别放置在wss_minimaltrust.config文件的对应位置,重启IIS后MyBaset WebPart就可以连接外部数据库了。

4 条评论:

  1. 我在链接数据库时,使用的是SQL Authentication模式。如果使用Windows Authentication模式的话,会出现如下错误:Share point Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'。也就是说,SharePoint的WebPart是通过这个帐户访问B机的数据库的。这个问题我还没有弄清楚。

    回复删除
  2. 我会再发一篇关于Trush Level的文章。

    回复删除
  3. 其实Web part的架构图中,每一个package可以理解为一个层。Model包里包含了数据库交互层。

    回复删除
  4. 更改web.config时不需要重启IIS,我刚刚知道,呵呵。

    回复删除