.net 代理類(WebService代理類的詳解 )


http://hi.baidu.com/654085966/item/53ee8c0f108ad78202ce1b1d   -----------轉自

客戶端調用Web Service的方式我現在知道的有三種,分別為Http_Get,Http_Post和通過代理類來調用
直接通過HTTP-GET和直接通過HTTP-POST來請求訪問Web服務是非常底層的且麻煩,(詳細用法請查看C#分類中的說明),還有一種就是通過代理類來訪問,DoNet框架提供的WSDL.EXE可以產生要求的代理類.

在.net命令里輸入wsdl http//url/xxx.asmx /language:cs /out:xxx.ss /protocol:httpGet即可生成HttpGet的代理類

首先我將列出WebService的原代碼:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient;

namespace Play.CH1
{
public class Service1 : System.Web.Services.WebService
{
   public Service1()
   {
    InitializeComponent();
   }

   private System.Data.SqlClient.SqlConnection sqlConnection1;

   private IContainer components = null;
    
   private void InitializeComponent()
   {
    this.sqlConnection1 = new System.Data.SqlClient.SqlConnection();

    this.sqlConnection1.ConnectionString = "workstation id=\"192.168.1.9\";packet size=4096;user id=sa;data source=\"192.168.1.9\";pe" +
     "rsist security info=True;initial catalog=pubs;password=";
    this.sqlConnection1.InfoMessage += new System.Data.SqlClient.SqlInfoMessageEventHandler(this.sqlConnection1_InfoMessage);

   }
   protected override void Dispose( bool disposing )
   {
    if(disposing && components != null)
    {
     components.Dispose();
    }
    base.Dispose(disposing);  
   }
  
   private void sqlConnection1_InfoMessage(object sender, System.Data.SqlClient.SqlInfoMessageEventArgs e)
   {
  
   }

   [WebMethod]
   public string doSearch(string keyword)
   {
    SqlDataAdapter da = new SqlDataAdapter("select top 20 title_id,title from titles where title like @title",sqlConnection1);
    da.SelectCommand.Parameters.Add(new SqlParameter("@title","%"+keyword+"%"));
    DataSet ds=new DataSet();
    da.Fill(ds);
    return ds.GetXml();
   }

}
}

再貼出剛生所生成的代理類的原代碼
//------------------------------------------------------------------------------
// <autogenerated>
//     This code was generated by a tool.
//     Runtime Version: 1.1.4322.573
//
//     Changes to this file may cause incorrect behavior and will be lost if 
//     the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------

// 
// 這個原始程式碼是由 wsdl,Version=1.1.4322.573 自動產生。
// 
using System.Diagnostics;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Services;


/// <remarks/>
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public class Service1 : System.Web.Services.Protocols.HttpGetClientProtocol {
    
    public Service1() {
        this.Url = "http://localhost/Play/CH1/Service1.asmx";
    }
    
    [System.Web.Services.Protocols.HttpMethodAttribute(typeof(System.Web.Services.Protocols.XmlReturnReader), typeof(System.Web.Services.Protocols.UrlParameterWriter))]
    [return: System.Xml.Serialization.XmlRootAttribute("string", Namespace="http://tempuri.org/", IsNullable=true)]
    public string doSearch(string keyword) {
        return ((string)(this.Invoke("doSearch", (this.Url + "/doSearch"), new object[] {
                    keyword})));
    }
    
    public System.IAsyncResult BegindoSearch(string keyword, System.AsyncCallback callback, object asyncState) {
        return this.BeginInvoke("doSearch", (this.Url + "/doSearch"), new object[] {
                    keyword}, callback, asyncState);
    }

    public string EnddoSearch(System.IAsyncResult asyncResult) {
        return ((string)(this.EndInvoke(asyncResult)));
    }
}

再來對代理類進行詳細說明

1. 代理類開始是引出一系列的命名空間,代碼的主題是定義一個跟待訪問的Web服務類同名的 從System.Web.Services.Protocols.HttpGetClientProtocol派生的代理類
2. 代理類具有如下四個方法
2.1 不帶參數的構造函數
構造函數主要是設定代理類的URL屬性,這個屬性表示WEB服務的URL.
2.2 doSearch方法
該方法是WEB服務的doSearch方法的本地代理版本,該方法被一個HttpMethodAttribute所標注,其目的是指示如何序列化發送到WEB服務的doSearch方法的參數以及如何反序列化WEB服務的響應.如果采用HTTP-GET調用WEB服務的方法,則必須把HTTPMothodAttribute的ReturnFormatter屬性設置為XmlReturnReader,ParameterFormatter屬性設置為UrlParameterWriter.

方法的返回值也被一個XmlRootAttribute特性所標記.該特性用以將類,結構,枚舉或結口標記為XML文檔實例的根(或項級)元素.該特性的ElementName屬性表示返回值對應的XML元素的名稱,Namespace屬性表示XML根元素的命名空間,IsNullable屬性表示返回值為空時ElementName所指的無素是否包xsi:nil屬性.
以上特性其實代替了我在C#分類中所講的利用HTTP-GGET;HTTP-POST來獲得WEB服務中的設置URL,在URL中附中參數,以及從返回XML文檔中提結果的大段代碼
再來看看方法中的代碼
return ((string)(this.Invoke("doSearch", (this.Url + "/doSearch"), new object[] { keyword})));
上述代碼先調用一個Invoke方法,(該方法繼承自父類HttpGetClientProtocol),然后把調用結果強制轉化為字符串類型.
Invoke方法的原型:
protected Object Invoke(string MethodName,string RequestUrl,Object[] Parameters);
參數:MethodName->表示要調用的Web服務的名稱,本例中的“doSearch“
參數:RequestUrl->表示WEB服務的方法的URL,它是由WEB服務的URL加上"/方法名"組成
參數:Parameters->是一個對象數組,包含要傳遞到遠程WEB服務的參數,數組中的順序與派生類的調用方法中的參數順序對應
返回值包含派生類方法的返回值和所有引用或輸出參數的對象數組
2.3 BegindoSearch方法
這個方法用以啟動對WEB服務的doSearch方法的異步調用
BegindoSearch的參數:
    keyword:     參數.
    callback:      AsyncCallback類型的委托對象,當異步調用結束后,callback所代表的函數將被回調,用來接收結果.
                       AsyncCallback委托原型:
                         [Serializable]
                         public delegate void AsyncCallback(IAsyncResult ar);
                         其: IAsyncResult接口:用於監視和管理異步操作.
                         IAsyncResult接口的原型
                         public interface IAsyncResult
                         {
                             object AsyncState{get;}//返回被作為最后一個參數提供的對象
                             WaitHandle AsyncWaitHandle{get;}//返回WaitHandle,它可用於執行WaitHandle.WaitOne,WaitAny,WaitAll,以實現同步
                             bool CompletedSynchronously{get;}//如果開始操作同步完成,則CompletedSynchronously=true
                             bool IsCompleted{get;}//在服務器完成調用處理后IsCompleted=true
                         }


2.4 EnddoSearch方法
這個方法用以結束異步調用,並獲得調用結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM