MOSS for Developers - 第 8 部分:Web 服务
从开发者的角度提供 Web 服务的概述。此内容是 www.myrampup.com 的 MOSS 内容的第 8 部分。
引言
由 Microsoft.SharePoint.SoapServer 命名空间提供的 Windows SharePoint Services Web 服务包括用于访问网站内容(例如,用于处理列表或网站数据)的方法,以及用于自定义会议、成像、文档工作区或搜索的方法。
这些服务中使用的 SOAP 接口为 Microsoft .NET Framework 开发者提供了对象模型,用于创建与 Windows SharePoint Services 远程交互的解决方案,这些解决方案可以从客户端或自定义应用程序进行访问。这些接口通过 Microsoft.SharePoint 程序集的服务器端对象模型进行定义,并且其设计经过优化,以减少客户端计算机和服务器之间进行事务处理的往返次数。
大多数 Web 服务通过 `/_vti_bin` 虚拟目录提供其功能,该目录在文件系统中映射到 `\\Program Files\Common Files\Microsoft Shared\web Server extensions\12\ISAPI` 物理目录。管理 Web 服务使用 `/_vti_adm` 虚拟目录,该目录映射到 `\12\ADMISAPI`。
您需要安装 Windows SharePoint Services 3.0 SDK
Windows SharePoint Services Web 服务
Windows SharePoint Services Web 服务提供了可用于远程处理 Windows SharePoint Services 部署的方法。下表列出并描述了可用的 Web 服务。
Service | 描述 |
管理 Web 服务 | 提供用于管理 Windows SharePoint Services 部署的方法,例如用于创建或删除网站。 |
通知 Web 服务 | 提供用于处理 SharePoint 网站中列表项通知的方法。 |
身份验证 Web 服务 | 提供用于登录使用基于窗体的身份验证的 SharePoint 网站的类。 |
复制 Web 服务 | 提供用于在 Windows SharePoint Services 的位置之间复制项的方法。 |
DocumentWorkspace Web 服务 | 提供用于管理文档工作区网站及其包含的数据的方法。 |
窗体 Web 服务 | 提供用于在处理列表内容时返回用户界面中所用窗体的方法。 |
Imaging Web 服务 | 提供允许您创建和管理图片库的方法。 |
ListDataRetrieval Web 服务 | 提供用于在 Windows SharePoint Services 的列表上执行查询的方法。 |
列表 Web 服务 | 提供用于处理列表和列表数据的方法。 |
Meetings Web 服务 | 提供允许您创建和管理会议工作区网站的方法。 |
People Web 服务 | 提供用于处理安全组的方法。 |
Permissions Web 服务 | 提供用于处理网站或列表权限的方法。 |
SharepointDirectoryManagementService Web 服务 | 提供用于远程管理分发组的方法。 |
SiteData Web 服务 | 提供用于从 Windows SharePoint Services 中的网站或列表中检索元数据或列表数据的方法。 |
Sites Web 服务 | 提供用于返回有关网站集网站模板信息的方法。 |
SPSearch Web 服务 | 提供用于在 Windows SharePoint Services 部署中远程执行搜索的方法。 |
UsersGroups Web 服务 | 提供用于处理用户、网站组和跨网站组的方法。 |
Versions Web 服务 | 提供用于处理文件版本的方法。 |
Views Web 服务 | 提供用于处理列表视图的方法。 |
WebPartPages Web 服务 | 提供将 Web 部件信息发送到 Web 服务以及从 Web 服务检索 Web 部件信息的方法。 |
Webs Web 服务 | 提供用于处理网站和子网站的方法。 |
演练:创建自定义 Web 服务
此编程任务概述了如何在 Windows SharePoint Services 3.0 的上下文中创建自定义 Web 服务。它逐步演示了创建简单的“Hello World”Web 服务的过程,然后展示了如何修改该服务,使其实现 Windows SharePoint Services 3.0 服务器端对象模型,以返回网站和列表数据。
创建 Web 服务的基础步骤
- 在 Microsoft Visual Studio 2005 中创建 ASP.NET Web 服务。
- 在 Web 服务中创建一个类库,其中包含 Web 服务的编程逻辑。
- 生成并编辑一个静态发现文件和一个 Web 服务描述语言 (WSDL) 文件。
- 将 Web 服务文件部署到 _vti_bin 目录。
- 创建一个客户端应用程序来使用该 Web 服务。
在 Visual Studio 中创建 ASP.NET Web 服务
第一步是在 Visual Studio 2005 中创建一个 ASP.NET Web 服务网站。
创建 ASP.NET Web 服务
- 在 Visual Studio 中,单击“文件”,指向“新建”,然后选择“网站”。
- 在“新建网站”对话框的“模板”框中,选择“ASP.NET Web 服务”,在“位置”框中选择“文件系统”,选择项目使用的编程语言和位置,然后单击“确定”。
- 在新的 Web 服务解决方案中,创建一个单独的类库项目来包含 Web 服务逻辑。要创建该项目,请单击“文件”,指向“新建”,然后选择“项目”。
- 在“新建项目”对话框的“项目类型”框中选择一种语言,在“模板”框中选择“类库”,为项目指定名称和位置,在“解决方案”框中选择“添加到解决方案”,然后单击“确定”。
- 在类库项目中添加对 **System.Web.Services** 命名空间的引用。在“解决方案资源管理器”中右键单击项目,单击“添加引用”,在“添加引用”对话框中选择 **System.Web.Services**,然后单击“确定”。
- 用 Visual Studio 在 Web 服务的 **App_Code** 文件夹中提供的默认服务类文件替换类库项目中的默认类文件。
用服务类文件替换类文件 - 在“解决方案资源管理器”中,将 Service.cs 或 Service.vb 拖到类库项目中的顶级节点。
- 删除 Class1.cs 或 Class1.vb 文件,并删除 **App_Code** 文件夹中剩余的 Service.cs 或 Service.vb 文件。
- 为类库创建强名称
- 在“解决方案资源管理器”中,右键单击类库项目,然后单击“属性”。
- 在“属性”对话框中,单击“签名”,选择“为程序集签名”,然后选择
在“选择强名称密钥文件”列表中。 - 在“创建强名称密钥”对话框中,为密钥提供文件名,清除“用密码保护我的密钥文件”复选框,然后单击“确定”。
- 仅生成类库项目,请在“解决方案资源管理器”中右键单击该项目,然后单击“生成”。
- 要将程序集添加到全局程序集缓存 (GAC),可以使用两个 Windows 资源管理器实例将程序集拖到 `%windows%\assembly` 目录,或者使用 Microsoft .NET Framework SDK 2.0 中安装的命令行实用程序 `gacutil.exe`。
使用 gacutil.exe 将类库 DLL 复制到 GAC - 要打开 Visual Studio 命令提示符,请单击“开始”,指向“所有程序”,指向“Microsoft Visual Studio 2008”,指向“Visual Studio 工具”,然后单击“Visual Studio 2008 命令提示符”。
-
在命令提示符下,键入以下格式的命令,然后按 Enter 键
gacutil.exe -if "<DLL 的完整文件系统路径>". - 现在,您可以修改 Web 服务的默认 Service.asmx 文件中的程序集信息,以包含 GAC 中 DLL 的信息。要从 GAC 获取信息,请在 Windows 资源管理器中打开 `%windows%\assembly` 目录,右键单击您的程序集,然后单击“属性”。
- 在“解决方案资源管理器”中打开 Service.asmx,右键单击该文件并单击“打开”。
- 从 Service.asmx 中的页面指令中删除 **CodeBehind** 属性,并修改 **Class** 属性的内容,使指令匹配以下格式,其中程序集名称“MyServiceAssembly”和公钥令牌是您在第 10 步打开的“属性”对话框中指定的值
<%@ WebService Language="C#" Class="Service, MyServiceAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8f2dca3c0f2d0131" %> - 在 Visual Basic 中,包括命名空间以标识类,例如,
Class="MyServiceNamespace.Service, MyServiceAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8f2dca3c0f2d0131"。 - 相应地重命名您的 .asmx 文件,然后保存更改。
生成和修改静态发现和 WSDL 文件
为了提供自定义 Web 服务的发现和描述,您必须创建一个 .disco 文件和一个 .wsdl 文件。由于 Windows SharePoint Services 对其 URL 进行虚拟化(例如,`http://MyServer/MySite/MySubsite` 变成 `http://MyServer`),因此您不能使用 ASP.NET 生成的自动生成的 .disco 和 .wsdl 文件。而是必须创建一个 .disco 页面和一个 .wsdl ASPX 页面,提供必要的重定向并保持虚拟化。
您可以通过临时将 Web 服务托管在虚拟目录(例如 `/_layouts`)中,然后使用 .NET Framework Web 服务发现工具 (Disco.exe) 来获取生成的文件,从而使用 ASP.NET 来生成 .disco 和 .wsdl 文件。
生成静态发现和 WSDL 文件
- 在 Windows 资源管理器中,将 Web 服务的 .asmx 文件复制到 `\\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS`。
- 从 LAYOUTS 目录的命令提示符处运行 Disco.exe 以生成 .disco 和 .wsdl 文件。以以下格式运行命令以在 `\LAYOUTS` 中生成文件
disco http://MyServer/_layouts/MyCustomWebService.asmx -
要注册 Windows SharePoint Services 对象模型的命名空间,请打开 .disco 和 .wsdl 文件,然后用类似以下内容的指令替换开头的 XML 处理指令 -- `<?xml version="1.0" encoding="utf-8"?>` --
<%@ Page Language="C#" Inherits="System.Web.UI.Page" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint.Utilities" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<% Response.ContentType = "text/xml"; %> - 在 .disco 文件中,修改 contractRef 和 soap address 标签,使其类似于以下示例,该示例通过使用 Microsoft.SharePoint.Utilities.SPHttpUtility 类替换字面路径以生成代码路径,并替换 **binding** 属性中指定的函数名
<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %>
docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>
xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>
xmlns:q1="http://tempuri.org/" binding="q1:HelloWorld" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>
xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> - 在 .wsdl 文件中,对指定的 SOAP 地址进行类似的替换
<soap:address location=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> /> - 将这两个文件分别重命名为 MyCustomWebServicedisco.aspx 和 MyCustomWebServicewsdl.aspx,以便可以通过 Windows SharePoint Services 发现您的服务。
将 Web 服务文件复制到 _vti_bin 目录
_vti_bin 虚拟目录物理映射到 `Local_Drive:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI` 目录,该目录包含 Windows SharePoint Services 中使用的默认 Web 服务文件。将新的 MyCustomWebServicewsdl.aspx 和 MyCustomWebServicedisco.aspx 文件,以及 MyCustomWebService.asmx 文件复制到 ISAPI 文件夹。
从 _vti_bin 目录,Web 服务可以向在添加服务 Web 引用时指定的网站提供其功能。
要验证您的自定义 Web 服务是否可发现,请导航到
http://MyServer/_vti_bin/MyCustomWebService.asmx.
在 spdisco.aspx 中列出新的 Web 服务
为了使您的 Web 服务在 Visual Studio 中与默认的 Windows SharePoint Services Web 服务一起被发现,请打开位于 \Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI 的 spdisco.aspx 文件,并添加以下代码,指定 Web 服务的 .asmx 文件。
<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx?wsdl"), Response.Output); %> docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx"), Response.Output); %> xmlns=" http://schemas.xmlsoap.org/disco/scl/ " /> <discoveryRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx?disco"),Response.Output); %> xmlns="http://schemas.xmlsoap.org/disco/" />
创建 Windows 应用程序以使用 Web 服务
将 Web 服务文件复制到 _vti_bin 目录后,下一步是创建一个 Windows 应用程序来使用 Web 服务。
创建使用 Web 服务的 Windows 应用程序
- 打开 Visual Studio 2005,然后在“文件”菜单上,指向“新建”,然后单击“项目”。
- 在“新建项目”对话框中,选择“Visual C#”或“Visual Basic”,然后选择“Windows 应用程序”模板。
- 在“名称”框中键入应用程序的名称,在“位置”框中指定项目文件的位置,然后单击“确定”。
- 在“解决方案资源管理器”中,右键单击项目,然后单击“添加 Web 引用”。
- 在“添加 Web 引用”浏览器的地址栏中,键入要应用服务的网站的 URL,如下所示,然后按 Enter 键
http://Server_Name/[sites/][Site_Name/]_vti_bin/MyCustomWebService.asmx - 单击“添加引用”以下载 Web 服务的服务合同。
- 在设计视图中打开 **Form1**,显示“工具箱”,然后将一个按钮拖到窗体上。
- 双击 **Form1** 上的 **Button1** 控件以在代码编辑器中显示代码隐藏文件,并添加以下调用自定义方法的代码。
Visual Basic
Dim MyCustomService As New Web_Reference_Folder.MyServiceClass() MyCustomService.UseDefaultCredentials = True MessageBox.Show(MyCustomService.HelloWorld())
C#
Web_Reference_Folder.MyServiceClass MyCustomService = new Web_Reference_Folder.MyServiceClass(); MyCustomService.UseDefaultCredentials = true; MessageBox.Show(MyCustomService.HelloWorld());
- 按 F5 编译并运行项目,您将看到一个显示“Hello World”的消息框。
其他资源和参考
- 处理 SharePoint Web 服务
- 面向专业 .NET 开发人员的 SharePoint 产品和技术简介
- Windows SharePoint Services 开发人员中心
- Windows SharePoint Services TechCenter
- SharePoint Server 开发人员中心
- SharePoint Server TechCenter