Web Service实现原理与异步调用

net2.0环境下,Web service中的每个方法,在Client端添加引用后生成的代理类中都会产生相应的异步方法和结束事件。我们可以利用这个异步方法和事件,轻松实现异 步调用web service.

    简单范例

    假设在web service中定义了一个数据查询的方法:ITPUB个人空间M8j+UrNX A


GmDY7l Obe0

  1. [WebMethod]
  2.    public DataSet ExecuteQuery(string SQL)
  3.         {
  4.             using (OracleConnection conn = new OracleConnection(connstrSQL))
  5.             {
  6.                 try
  7.                 {
  8.                     conn.Open();

  9. )dDHUuf0
  10.                     OracleCommand cmd = new OracleCommand(sql,conn);
  11. ITPUB个人空间!vl pw5e@1ahT&i
  12.                     OracleDataAdapter ada = new OracleDataAdapter(cmd);
  13.                     DataSet ds = new DataSet();
  14.                     ada.Fill(ds);
  15. ITPUB个人空间o#@|b#l
  16.                     return ds;
  17.                 }
  18.                 catch (OracleException ex)
  19.                 {
  20.                     throw new Exception(ex.Message);
  21.                 }
  22.                 finally
  23.                 {
  24.                     conn.Close();
  25.                 }

  26. vr$@#V{*U4r0c0
  27.         }

    客户端:ITPUB个人空间5fMT!F3h0RPu8I rp

ITPUB个人空间%/F7P'C(`5hz

  1. ///说明:
  2. ///panel1中放置了动态加载字样的图 片等
  3. ///   
  4.  public partial class frmStock : Form.
  5.     {
  6.         Service.MyService w = new Service.MyService(); //调用web service

  7. }'u` z'yd0
  8.         public frmStock()
  9.         {
  10.             InitializeComponent();
  11.         }
  12. ITPUB个人空间9d}:K2@X'J G
  13.         private void frmStock_Load(object sender, EventArgs e)
  14.         {
  15.             //添加异步方法执行后触发事件
  16.             w.ExecuteQueryCompleted += new WMS.ExecuteQueryCompletedEventHandler(w_ExecuteQueryCompleted);

  17. T"z R Bt7h*c(p-X0r0
  18.         }
  19. ITPUB个人空间.r:E4W#o fkw
  20.         private void btnFind_Click(object sender, EventArgs e)
  21.         {
  22.             string sql = "select * from test";

  23. xgB7xx#u|0
  24.              w.ExecuteQueryAsync(sql);  //调用对应异步方法
  25. ITPUB个人空间(u$^%B Q/T Y3C
  26.              ChangeStatus(true);
  27. ITPUB个人空间%N9L_W E7`
  28.         }

  29. 1Cm3g!s#Kycq0
  30.         void w_ExecuteQueryCompleted(object sender, WMS.ExecuteQueryCompletedEventArgs e)
  31.         {
net2.0环境下,Web service中的每个方法,在Client端添加引用后生成的代理类中都会产生相应的异步方法和结束事件。我们可以利用这个异步方法和事件,轻松实现异 步调用web service.

    简单范例

    假设在web service中定义了一个数据查询的方法:
9|B1yj1dI k*W0

ITPUB个人空间1n{m-ex T

  1. [WebMethod]
  2.    public DataSet ExecuteQuery(string SQL)
  3.         {
  4.             using (OracleConnection conn = new OracleConnection(connstrSQL))
  5.             {
  6.                 try
  7.                 {
  8.                     conn.Open();
  9. ITPUB个人空间:pH/-gJ1g7f#G b;_4B
  10.                     OracleCommand cmd = new OracleCommand(sql,conn);

  11. &s0o;/$f$hlv0
  12.                     OracleDataAdapter ada = new OracleDataAdapter(cmd);
  13.                     DataSet ds = new DataSet();
  14.                     ada.Fill(ds);

  15. *qSnp+LlQ/N0
  16.                     return ds;
  17.                 }
  18.                 catch (OracleException ex)
  19.                 {
  20.                     throw new Exception(ex.Message);
  21.                 }
  22.                 finally
  23.                 {
  24.                     conn.Close();
  25.                 }

  26. {7sX VmS6l.BA0
  27.         }

    客户端:
0|0L3@ hG`0


j OW2/K)[0

  1. ///说明:
  2. ///panel1中放置了动态加载字样的图 片等
  3. ///   
  4.  public partial class frmStock : Form.
  5.     {
  6.         Service.MyService w = new Service.MyService(); //调用web service
  7. ITPUB个人空间y Km)}2f'N"R
  8.         public frmStock()
  9.         {
  10.             InitializeComponent();
  11.         }
  12. ITPUB个人空间 n#e8xA0G8QM*P
  13.         private void frmStock_Load(object sender, EventArgs e)
  14.         {
  15.             //添加异步方法执行后触发事件
  16.             w.ExecuteQueryCompleted += new WMS.ExecuteQueryCompletedEventHandler(w_ExecuteQueryCompleted);
  17. ITPUB个人空间(P8Au2E |4z.Q*F
  18.         }
  19. ITPUB个人空间.L/m? p m
  20.         private void btnFind_Click(object sender, EventArgs e)
  21.         {
  22.             string sql = "select * from test";

  23. 3@ g;o:E"TyJ0
  24.              w.ExecuteQueryAsync(sql);  //调用对应异步方法
  25. ITPUB个人空间g0Gk BoOC9D9F1x
  26.              ChangeStatus(true);

  27. 6phh&D2{.v D [p i0
  28.         }
  29. ITPUB个人空间9t6z g'WM7J i7k
  30.         void w_ExecuteQueryCompleted(object sender, WMS.ExecuteQueryCompletedEventArgs e)
  31.         {
  32. DataTable dt= e.Result.Tables[0];  //获得执行结果 e
  33.      ChangeStatus(false);
  34.           if (dt.Rows.Count <= 0)
  35.            {
  36.                MessageBox.Show("没有数据""information", MessageBoxButtons.OK, MessageBoxIcon.Information);
  37.                return;
  38.            }
  39.            gvshow.AutoGenerateColumns = false;
  40.            gvshow.DataSource = dt;
  41.         }
  42.         private void btnExit_Click(object sender, EventArgs e)
  43.         {
  44.             this.Close();
  45.         }
  46.         private void ChangeStatus(bool sign)
  47.         {
  48.             panel1.Visible = sign;
  49.             
  50.         }
  51.     }

       这样,可以

        1.避免了假死现象

        2.可以提供友好的用户体验

        

        实现原理

        web service 发布后,客户端添加引用,之后vs实际上在此时已经在后台生成本地代理类。之后看起来像是对web service的操作,实际上是对本地代理类的操作。代理类中处理网路访问逻辑,客户端的使用就象操作本地类一样简单便捷。

        客户端发出web service请求后,请求到达代理类,代理类处理请求从服务端获得SOAP数据包,而后进行数据处理后转发客户端。此中间涉及到的关于 SOAP,WSDL等定义,简单的可以理解为:SOAP中定义了传输数据类型的格式和规则,而WSDL则以XML的形式定义了web service的消息和有关操作,通过http传输协议进行数据传输...

        那么代理类中到底如何定义的呢?

        我们可以通过自定义代理类的方式来分析代理类的详细信息。

        1.首先创建web service:Service.asmx

        2.IIS中建立虚拟目录并发布

        3.通过WSDL.exe工具生成代理类。

        打开SDK命令提示窗口,如下作业:ITPUB个人空间(XB+Y}O(G{Bk

    d:/Program Files/Microsoft Visual Studio 8/SDK/v2.0>wsdlhttp://localhost/Serve/Service.asmx?wsdlITPUB个人空间-hQ8j(?Wq;nm
    Microsoft (R) Web Services Description Language UtilityITPUB个人空间o&N(}KNoT _I
    [Microsoft (R) .NET Framework, Version 2.0.50727.42]
    5d8YM3} sn0Copyright (C) Microsoft Corporation. All rights reserved.
    *_ yAC&NPD9E2{0Writing file 'd:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Service.cs'.

        其中service.cs就是生成的代理类,打开可见,其中涉及到异步方法,事件的生成。(部分代码如下)

     


    Pg|k7t#c0
    1.  /// <remarks/>
    2.     public event HelloWorldCompletedEventHandler HelloWorldCompleted;
    3.     
    4.     /// <remarks/>
    5.     public event showInfoCompletedEventHandler showInfoCompleted;
    6.     
    7.     /// <remarks/>
    8.     [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/HelloWorld", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    9.     public string HelloWorld() {
    10.         object[] results = this.Invoke("HelloWorld"new object[0]);
    11.         return ((string)(results[0]));
    12.     }
    13.     
    14.     /// <remarks/>
    15.     public System.IAsyncResult BeginHelloWorld(System.AsyncCallback callback, object asyncState) {
    16.         return this.BeginInvoke("HelloWorld"new object[0], callback, asyncState);
    17.     }
    18.     
    19.     /// <remarks/>
    20.     public string EndHelloWorld(System.IAsyncResult asyncResult)
      Pu"u&i9s0
    21. {ITPUB个人空间1aq1r5dWE.XQsX
    22.       object[] results = this.EndInvoke(asyncResult);
    23.         return ((string)(results[0]));
    24.     }
    25.     
    26.     /// <remarks/>
    27.     public void HelloWorldAsync() {
    28.         this.HelloWorldAsync(null);
    29.     }
    30.     
    31.     /// <remarks/>
    32.     public void HelloWorldAsync(object userState) {
    33.         if ((this.HelloWorldOperationCompleted == null)) {
    34.             this.HelloWorldOperationCompleted = new System.Threading.SendOrPostCallback(this.OnHelloWorldOperationCompleted);
    35.         }
    36.         this.InvokeAsync("HelloWorld"new object[0], this.HelloWorldOperationCompleted, userState);
    37.     }
    38.     
    39.     private void OnHelloWorldOperationCompleted(object arg) {
    40.         if ((this.HelloWorldCompleted != null)) {
    41.             System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
    42.             this.HelloWorldCompleted(thisnew HelloWorldCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
    43.         }
    44.     }
    45.     
    46.     /// <remarks/>

    4.通过csc命令把service.cs生成为dll文件

    5.在专案中添加对此dll的引用

    6.这样对此dll的应用实际上就是通过这个代理类访问我们发布的web service.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值