原文地址:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odc_sp2003_ta/html/odc_writingcustomwebservicesforsppt.asp
摘要: 學習建立自訂SharePoint Web services ,並建立基於SharePoint 的文檔上傳Web servicefor用來實現外部應用程式遠端存取文件庫中的文檔。
代碼下載: ODC_WritingCustomWebServicesSampleSPPT.EXE.
我們可以基於WSS構建強大的項目。做為開發人員,我們有時需要建立基於WSS的自訂 Web服務來滿足特定的開發要求。
注意:由於WSS增強的安全性,我們需要一些特殊的步驟來建立自訂Web服務。當我們使用VS.NET提供的ASP.NET Web service模板來建立我們的SharePoint Web service時,我們必須將Web service建立到單獨的IIS網站中,而不能和WSS處於同一個IIS網站(不能使用相同的連接埠)。同時,我們還必須是運行WSS的機器上本機系統管理員群組的成員。
下面列出了開發自訂SharePoint Web 服務的簡要步驟:
1、如果我們的WSS位於預設網站(連接埠80),那麼我們需要建立一個新的網站並配置不同的連接埠。新的網站作為開發用網站,而WSS所在的預設網站作為生產環境的部署網站。
2、在開發網站上建立一個Web Service項目
3、產生並修改靜態發現(.disco)檔案和 .wsdl檔案,並儲存成 .aspx頁面。在頁面內容頂部註冊Microsoft.SharePoint命名空間。
4、修改.disco和.wsdl檔案,使其支援服務虛擬化機制。
5、當我們開發完成Web service後,將相關的檔案部署到WSS網站的_vti_bin和_vti_bin\bin虛擬目錄下。
執行個體ODC_WritingCustomWebServicesSampleSPPT.EXE 提供了一個遠端存取文檔的Web服務樣本。項目中實現了一些Microsoft.SharePoint命名空間中暴露出來的文檔存取方法,如SPFile.CheckIn, SPFile.CheckOut, SPFile.UndoCheckOut, 和 SPFileCollection.Add。在沒有這些自訂的Web service時,我們必須使用WebDAV或FrontPage RPC來實作類別似的文檔訪問。
在WSS的伺服器上安裝該樣本
- 下載ODC_WritingCustomWebServicesSampleSPPT.EXE並解壓到WSS前端伺服器的本地路徑。Local_drive:\CreatingaCustomWebServiceSample
- 雙擊build.bat檔案來執行編譯和安裝。
如下檔案被拷貝到Local_drive:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\60\isapi\ 目錄:
- SPFiles.asmx
- spfilesdisco.aspx
- spfileswsdl.aspx
如下檔案被拷貝到Local_drive:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\60\isapi\BIN\目錄:
- WSCheckOut.dll
- WSCheckOut.pdb
編寫一個自訂Web服務
1、 在開發用網站上使用VS.NET利用其提供的模板建立一個空的 ASP.Net Web Service項目,其中將包括一個Service1.asmx 檔案。
2、 進入代碼編輯,移除下面的行的注釋後編譯該項目。
//[WebMethod]
//public string HelloWorld()
//{
// return "Hello World";
//}
3、 現在,我們可以將我們的服務部署到WSS網站中。
要想將自訂的Web服務綁到WSS上,VS .NET需要一些特定的基於.disco和.wsdl檔案的.aspx檔案。首先使用VS .NET命令列工具產生我們需要的.disco和.wsdl檔案。
建立並編輯.disco和.wsdl檔案
使用VS .NET命令列工具在目前的目錄中產生Service1.disco 和 Service1.wsdl,命令如下:
Disco http://server_name:New_Port/Project_Name/Service_1.asmx
開啟Service1.disco檔案並定位到下面的行:
<?xml version="1.0" encoding="utf-8"?>
將其替換成:
<%@ Page Language="C#" Inherits="System.Web.UI.Page"%> <%@ Assembly Name="Microsoft.SharePoint, Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Import Namespace="Microsoft.SharePoint.Utilities" %> <%@ Import Namespace="Microsoft.SharePoint" %>
<% Response.ContentType = "text/xml"; %>
以 Service1disco.aspx儲存該檔案。
對Service1.wsdl也進行同樣的修改並儲存為Service1wsdl.aspx。
修改 Service1disco.aspx和Service1wsdl.aspx使其支援服務虛擬化機制
開啟Service1disco.aspx檔案並定位到下面的行:
<contractRef ref="http://server_name:New_Port/Project_Name/Service1.asmx?wsdl" docRef=
"http://server_name:New_Port/Project_Name/Service1.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" />
對標籤<contractRef>進行如下修改:
<contractRef ref=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request)
+ "?wsdl", '"'); %> docRef=<% SPEncode.WriteHtmlEncodeWithQuote(Response,
SPWeb.OriginalBaseUrl(Request), '"'); %> xmlns="http://schemas.xmlsoap.org/disco/scl/" />
定位到下面的行:
<soap address="http://server_name:New_Port/Project_Name/Service1.asmx" xmlns:q1="http://tempuri.org/" binding="q1:Service1Soap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
修改<soap address> 標籤為:
<soap address=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %> xmlns:q1="http://tempuri.org/" binding="q1:Service1Soap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
儲存所有更改。
開啟Service1wsdl.aspx檔案並定位到下面的行:
<soap:address location="http://server_name:New_Port/Project_Name/Service1.asmx" />
修改soap:address行為:
<soap:address location=<% SPEncode.WriteHtmlEncodeWithQuote(Response,
SPWeb.OriginalBaseUrl(Request), '"'); %> />
儲存所有更改。
將Web service相關檔案拷貝到_vti_bin虛擬目錄
拷貝Service1wsdl.aspx,Service1disco.aspx和Service1.asmx到_vti_bin虛擬目錄。該目錄是預設的Web服務存放目錄。
拷貝對應的.dll檔案到_vti_bin/bin虛擬目錄。
注意:_vti_bin/bin虛擬目錄映射到實體路徑\\Server_Name\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ISAPI\bin