3、名詞:
RPC: Remote Procedure Calls遠程過程調用
WSDL:Web Service Description Language,Web服務描述語言
UDDI:Universal Description,Discovery,and Integration
4、SOAP消息
是客戶機和服務器之間通信的基本單元。SOAP消息包含一個SOAP封套,該封套把所有的SOAP消息封裝在一個塊中。SOAP封套本身由兩部分組成: SOAP標題和SOAP體。標題是可選的,SOA體是必須的。如下圖:
<!--[if mso & !supportInlineShapes & supportFields]-->
5、處理Web服務的命名空間
.Net Framework中有三個命名空間可以處理Web服務:
System.Web.Services命名空間中的類用於創建Web服務。
System.Web.Services.Description:通過WSDL描述Web服務。
System.Web.Services.Protocols:創建SOAP請求和響應。
6、創建Asp.net Web服務方法:
6.1 File->New->Web Site,選擇 “Asp.net Web服務”。
6.2 修改Service1.cs中的代碼,加入自己需要的方法ReverseString()。代碼如下:
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
/*
* WebService屬性:WebService類用屬性WebService來標記。
* WebServiceBinding屬性:用於把Web服務標記為可交互操作的一致性級別。
*/
[WebService(Namespace = "
http://192.168.1.79/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service()
{
//如果使用設計的元件,請取消註解下行程式碼
//InitializeComponent();
}
/*
* 加入WebMethod才會在服務頁面中顯示
* WebMethod屬性:使用WebMethod屬性標記的方法可從WebMethod中調用,並可以被客戶機上調用。
* 沒有標記的,則不能被客戶機調用。使用屬性類WebMehodAttribute,方法就可以在遠程客戶機上調用,
* 並可以定義是否緩存響應時間有多長,會話狀態是否與指定的參數一起存儲。 *
*/
[WebMethod]
public string ReverseString(string message) //自己添加的方法。獲得倒序后的值
{
char[] arr = message.ToCharArray();
//顛倒順序
Array.Reverse(arr);
message = new string(arr);
return message;
}
} 這樣一個「字符倒序」的服務就做好了。
6.3 運行服務:在頁面上會看到自己添加的ReverseString方法。單擊ReverseString方法。在Value中輸入字符值「ab」,單擊「叫用」,在彈出的頁頁中會得到值「ba」。如下。
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="
http://192.168.1.79/">ba</string>
6.4說明:
生成文件:
Service.asmx:保存Web服務類。所有Web服務都用.asmx擴展名來標識。
Service1.cs:后台代碼。放在App_Code目錄下,便於使用。
[WebService(Namespace = "
http://192.168.1.79/")]中的Namespace的內容主要用於唯一標識XML元素,其中的鏈接不一定存在。
7、創建客端程序:
7.1 客戶程序說明:
要調用一個方法,客戶機必須創建一個與Web服務所在的服務器之間的連接,並發送一個Http請求,傳送一個SOAP消息。方法調用必須轉換為SOAP消息。我們創建時,這部分內容System.Web.Services.Protocols.SoapHttpClientProtocol類會在后台自動完成。
如果不使用SoaHttpClientProtocol類,可以使用其它代理程序類,HttpGetClientProtocol和httpPostClientProtocol僅執行簡單的HTTPGET或HTTP Post請求,沒有SOAP調用的系統開銷。HttpGetClientProtocol和httpPostClientProtocol的缺點是其它的Web服務不支持它,且只能發送簡單數據。
void btnCommit_Click(object sender, EventArgs e)
{
//實例化代理為類
WebServicesSample.Service ws = new ServiceSimpleClient.WebServicesSample.Service();
//把SOAP消息傳送給服務器,以調用web服務
textBox2.Text = ws.ReverseString(textBox1.Text);
}
7.2.4 這樣運行程序后,在Textbox1中輸入內容,單擊按鈕,就會在TextBox2中倒序顯示
7.2.5 說明:在顯示所有文件后,在Web References\"Web參考名"\Reference.map"有一個Reference.cs,此為代理程序的源碼。此為系統自動生成的代碼。
其中需要說明地方列出如下:
/*
* Service類派生於SoapHttpClientProtocol類
* 類System.Web.Services.Protocols.SoapHttpClientProtocol是客戶端代理程序的基類。
* Invoke()方法轉換參數,建立一個SOAP消息,發送給Web服務。調用哪個Web服務由 Url屬性確定。
* SoaHttpClientprotocol類也支持使用Begininvoke()和EndInvoke()方法的異步調用。
* WebServiceBindingAttribute屬性:把綁定值設置為Web服務
*/
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.1433")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name = "ServiceSoap",
Namespace = "
http://192.168.1.79/")]
public partial class Service : System.Web.Services.Protocols.SoapHttpClientProtocol
{
}
/// <remarks/>
public Service()
{
//屬性Url設置為服務。
this.Url = global::ServiceSimpleClient.Properties.Settings.Default.
ServiceSimpleClient_WebServicesSample_Service;
}
//ReverseString的客戶端
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("
http://192.168.1.79/ReverseString",
RequestNamespace = "
http://192.168.1.79/", ResponseNamespace = "
http://192.168.1.79/",
Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.
Protocols.SoapParameterStyle.Wrapped)]
public string ReverseString(string message)
{
//調用SoapHttpClientProtocol.Invoke()方法,建立一個SOAP消息,發送給Web服務。
object[] results = this.Invoke("ReverseString", new object[] {
message});
return ((string)(results[0]));
}
CIO之家 www.ciozj.com 公众号:imciow