asp.net|web|web服務|建立 部署一個XML Web服務包括複製.asmx檔案和任何XML Web服務使用的彙編檔案,而不要把Microsoft.NET Framework的一部分作為Web伺服器上的虛擬目錄。有關如何部署一個XML Web服務的資訊,請參見"部署XML Web服務"。XML Web服務對使用發現機制的使用者適用。使用者可以瀏覽一個特殊的發現檔案或Web伺服器的根來定位發現檔案。從這些檔案中,他們可以判斷那些服務對他們來說有用。
部署XML Web服務
部署一個XML Web服務包括把.asmx檔案和任何XML Web服務使用的彙編檔案,而不是Microsoft.NET Framework的一部分,複製到Web伺服器上。
例如,假設你把一個XML Web服務命名為StockServices。為了部署XML Web服務,你需要在你的Web伺服器上建立一個虛擬目錄和把XML Web服務的.asmx檔案放入這個目錄。這個虛擬目錄還應該是一個IIS Web應用程式,雖然它不是必需的。一個典型的部署將有下面的目錄結構:
\Inetpub \Wwwroot \StockServices StockServices.asmx \Bin |
你的XML Web服務使用的彙編不是Microsoft.NET Framework一部分的。
XML Web服務發布的條目
當你發布一個XML Web服務時,下列條目用來部署一個Web伺服器。
條目 |
描述 |
Web應用程式目錄 |
作為你的XML Web服務的根目錄。所有的檔案都存放在這個目錄中。這個目錄應該被標記為一個IIS Web應用程式所用。 |
<MyXMLWebService>.asmx 檔案 |
調用XML Web服務的用戶端的基本URL。這個檔案可以為任何有效檔案名稱。 |
<MyXMLWebService>.disco檔案 |
(可選的)作為XML Web服務的發現機制。.disco檔案不會自動地為XML Web服務建立。這個檔案可以為任何有效檔案名稱。 |
Web.config檔案 |
(可選擇的)如果你需要覆蓋預設配置設定,你可以包含一個web.config檔案。XML Web服務使用這個設定檔來允許系統的定製和可擴充性。例如,如果在系統中你的XML Web服務需要驗證而其他的Web應用程式不需要的話,你可以提供一個該XML Web服務特定的web.config檔案。 |
\Bin目錄 |
包含用於這個XML Web服務的二進位檔案。如果你的XML Web服務類和.asmx檔案不在同一個目錄下,那麼包含類的組件必須在\Bin目錄中。 |
發現一個XML Web服務
XML Web服務發現是定位和詢問XML Web服務描述的過程,這是訪問一個XML Web服務的預備步驟。通過發現過程,XML Web服務用戶端可以在設計時得知一個XML Web服務存在,它能做什麼以及如何適當的與之互動。
可以在XML Web服務發布一個.disco檔案時編程發現,.disco是一個包含與其它發現文檔、XSD模式和服務描述串連的XML文檔。換句話說,使用ASP.NET建立的XML Web服務自動地有提供一個產生髮現文檔的能力。當使用帶有?DISCO的URL訪問時,一個發現文檔自動地為XML Web服務產生。例如,如果到一個XML Web服務的URL是www.contoso.com/getquote.asmx,然後自動以www.contoso.com/getquote.asmx?DISCO產生一個發現文檔。
為了使能發現一個XML Web服務:
使用你喜歡的編輯器建立一個XML文檔,把標記<?xml version="1.0"?>添加到第一行。
在這個XML文檔內添加一個<discovery>元素,如:
<disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco/"> </disco:discovery> |
在<discovery>元素內,添加到服務描述、XSD模式和其他發現文檔的引用。
你可以添加對任意你想公開的引用。服務描述引用在一個發現文檔中通過使用http://schemas.xmlsoap.org/disco/scl/ XML網域名稱空間添加一個<contractRef>元素來指定。同樣地,對其它的發現文檔和XSD模式的引用分別通過添加<discoveryRef>和<schemaRef> XML元素來指定。對於XSD模式引用,必須指定XML網域名稱空間http://schemas.xmlsoap.org/disco/schema。。下面的程式碼範例有對於發現文檔、服務描述和一個XSD模式的引用。
<?xml version="1.0"?> <discovery xmlns="http://schemas.xmlsoap.org/disco/"> <discoveryRef ref="/Folder/Default.disco"/> <contractRef ref="http://MyWebServer/UserName.asmx?WSDL" docRef="Service.htm" xmlns="http://schemas.xmlsoap.org/disco/scl/"/> <schemaRef ref="Schema.xsd" xmlns="http://schemas.xmlsoap.org/disco/schema/"/> </discovery> |
引用可以與發現文檔存在於的目錄有關,就如在discoveryRef元素所示,或與一個URI有關,就如在contractRef元素所示。
通過複製發現文檔到Web伺服器的一個虛擬目錄下,把發現文檔部署到這台Web伺服器上。
選擇性地,如果你想要通過指定一個IIS應用程式而不需要指定一個文檔來允許預期消耗者導航到一個URL,那麼你可以添加一個到IIS應用程式的預設的頁面。這對預期消耗者有益,他們不必知道任意發現文檔的名稱。使用者可以提供想下面發現過程中的URL:
http://MyWebServer/MyWebApplication
如果用於Web應用程式的預設頁面是一個HTML頁面:
在用於Web伺服器的預設Web的頁面的<head>標記中添加一個連結到發現文檔。例如,如果你命名你的發現文檔MyWebService.disco並把它放入與預設頁面相同的目錄中,你需要放置下面的標記到預設的Web頁面中。
<HEAD> <link type='text/xml' rel='alternate' href='MyWebService.disco'/> </HEAD> |
如果用於Web應用程式的預設頁面是一個XML文檔:
在用於Web伺服器的預設Web的頁面的<head>標記中添加一個連結到發現文檔。例如,如果你命名你的發現文檔MyWebService.disco並把它放入與預設頁面相同的目錄中,你需要放置下面的代碼到預設的Web頁面的頂端。
<?xml-stylesheet type="text/xml" alternate="yes" href="MyWebService.disco" ?> |
選擇性地,如果你使用Visual Studio.NET,你可以開啟動態發現來允許XML Web服務用戶端應用程式來在一個沒有建立發現文檔的Web伺服器上發現可用的XML Web服務。當動態發現開啟的時候,客戶應用程式在Add Web Reference對話方塊中指定一個引用帶有.vsdisco部分的檔案的URL,例如www.contoso.com/default.vsdisco,來代替特定的發現文檔。
為了開啟用於一個Web伺服器的動態發現,要修改machine.config來添加下面的<add>元素。
<configuration> <system.web> <httpHandlers> <add verb="*" path="*.vsdisco" type="System.Web.Services.Discovery.DiscoveryRequestHandler, System.Web.Services, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/> </httpHandlers> </system.web> </configuration> |
注意:當動態發現開啟的時候,所有的XML Web服務和存在於Web伺服器的發現文檔都是可發現的。因此,當開啟動態發現時必須小心,因為如果Web伺服器不在帶有隔火牆的安全網路中的話,它可能會在無意中暴露敏感性資料。
用ASP.NET建立的XML Web服務的配置選擇
XML Web服務的配置遵循和所有的ASP.NET Web應用程式使用的相同的範式。ASP.NET配置是一個基於XML的文字檔配置結構,既強大又可擴充。設定檔只是一組XML元素,描述用於Microsoft.NET Framework的特定技術特性的配置選擇。就 XML Web服務而言,配置選擇是封裝在設定檔的webServices XML元素中的。
配置訊息傳送協議和服務協助頁面
用於XML Web服務訊息傳送協議和服務協助頁面在設定檔的<webServices>元素下的<protocols> XML元素中配置。通過添加<add>和<remove>元素來進行配置,制定設定檔範圍內的那個設定有效。<add>元素明確地添加對設定檔範圍內的設定的支援,而<remove>元素移除對更高的配置等級的支援。例如,可以使用Machine.config檔案中的<add>元素在機器層級添加一個通訊協定設定,然後使用Web.config檔案中的<remove>元素移除對某個Web應用程式的設定。下面的是<add>和<remove>元素的文法:
<{add|remove} name="protocol name" /> |
<add>和<remove>元素的name屬性有下列選項:
設定 |
描述 |
HttpSoap |
支援用於XML Web服務的SOAP協議的控制項。預設情況下安裝已經添加了這個支援。 |
HttpGet |
支援用於XML Web服務的HTTP - GET協議的控制項。預設情況下安裝不添加這個支援。 |
HttpPost |
支援用於XML Web服務的HTTP - POST協議的控制項,不管請求從何起源。預設情況下安裝不添加這個支援。 |
HttpPostLocalhost |
當請求來源於本機電腦的時候,支援用於XML Web服務的HTTP - POST協議的控制項。如果HttpPost添加到當前配置中,那麼這個設定就無效了。預設情況下安裝已經添加了這個支援。 |
Documentation |
指定一個服務協助頁面是否顯示。預設情況下安裝已經添加了這個支援。 |
注意:.NET Framework 1.0版支援HttpSoap、HttpGet、HttpPost和Documentation設定和所有預設的機器層級能夠使用的設定。
安全建議
在使用用於XML Web服務的HTTP-GET或HTTP-POST協議之前,你應該知道這樣做可能把它暴露給無意的調用。例如,一個未料想到的使用者可能接收一個帶有XML Web服務鏈結接的電子郵件,點選連結,使用電子郵件中提供的參數調用XML Web服務。你應該在使用HTTP-GET或HTTP-POST協議之前,你應該考慮這種無意中的調用是否有害。
使HTTP-GET和HTTP-POST協議對於整機失效
使用你習慣的文本編輯程式開啟Machine.config檔案。(Machine.config檔案預設的地點在安裝目錄的\Config子目錄下。)
如果webServices部分中有對HTTP-GET和HTTP-POST的支援,那麼就把這幾行注釋掉。在這樣做以後,webServices部分應該如下:
<webServices> <protocols> <add name="HttpSoap"/> <!-- <add name="HttpPost"/> --> <!-- <add name="HttpGet"/> --> <add name="Documentation"/> <add name="HttpPostLocalhost"/> </protocols> </webServices> |
儲存Machine.config。
在下一次請求這台機器上的XML Web服務的時候,配置的改變將生效。
使用於單獨Web應用程式的協議支援失效
使用你習慣的編輯程式開啟Web應用程式根目錄下的Web.config。(如果無存在Web.config檔案,那麼就建立一個。)
修改Web.config的webServices部分,明確的移除通訊協定設定。下面的樣本明確地移除HTTP- POST和HTTP- GET協議:
<webServices> <protocols> <remove name="HttpPost" /> <remove name="HttpGet" /> </protocols> </webServices> |
儲存Web.config。
在下一次請求這個Web應用程式的XML Web服務的時候,配置的改變將生效。
服務協助頁面
在一個Web瀏覽器中不使用任何參數導航到XML Web服務的URL能讓客戶查看這個XML Web服務的服務協助頁面,如果這個服務進行了這樣的配置。服務協助頁面預設情況下包含關於與XML Web服務通訊的方法以及XML Web服務方法的基本資料。因為服務協助頁面僅僅是一個ASP.NET Web表單,它可以被替換或者被修改成包含類似於公司標識這樣的條目。服務協助頁面的檔案名稱在設定檔的<wsdlHelpGenerator>XML元素中指定。服務協助頁面只用來顯示有在<protocols> XML元素指定的Documentation協議的設定檔範圍內的XML Web服務。預設情況下,Documentation在Machine.config檔案中指定。
使服務協助頁面對於一個單獨的Web應用程式失效。
使用你習慣的編輯程式開啟Web應用程式根目錄下的Web.config。(如果無存在Web.config檔案,那麼就建立一個。)
修改Web.config的webServices部分,明確的移除Documentation協議。
<webServices> <protocols> <remove name="Documentation" /> </protocols> </webServices> |
儲存Web.config。
在下一次請求這個Web應用程式的XML Web服務的時候,配置的改變將生效。
注意取消Documentation協議還禁止任何Web應用程式內用於XML Web服務的WSDL檔案產生。這防止用戶端產生代理類,除非建立一個自訂WSDL檔案來為為它們設定。為了在Web應用程式中保留用於XML Web服務的WSDL檔案產生,而不提供任何關於XML Web服務的可讀的資訊,那麼你可以添加一個<wsdlHelpGenerator>元素到Web應用程式的Web.config檔案中,設定href屬性為你建立的一個空白的HTML頁面。下面的程式碼範例是一個Web.config檔案的摘錄,設定服務協助頁面為MyBlank.htm檔案。
<webServices> <wsdlHelpGenerator HREF="docs/MyBlank.asp"/> </webServices> |