web service實現原理與非同步呼叫
簡單範例
假設在web service中定義了一個資料查詢的方法:
- [WebMethod]
- public DataSet ExecuteQuery(string SQL)
- {
- using (OracleConnection conn = new OracleConnection(connstrSQL))
- {
- try
- {
- conn.Open();
- OracleCommand cmd = new OracleCommand(sql,conn);
- OracleDataAdapter ada = new OracleDataAdapter(cmd);
- DataSet ds = new DataSet();
- ada.Fill(ds);
- return ds;
- }
- catch (OracleException ex)
- {
- throw new Exception(ex.Message);
- }
- finally
- {
- conn.Close();
- }
- }
客戶端:
- ///說明:
- ///panel1中放置了動態載入字樣的圖 片等
- ///
- public partial class frmStock : Form.
- {
- Service.MyService w = new Service.MyService(); //呼叫web service
- public frmStock()
- {
- InitializeComponent();
- }
- private void frmStock_Load(object sender, EventArgs e)
- {
- //新增非同步方法執行後觸發事件
- w.ExecuteQueryCompleted += new WMS.ExecuteQueryCompletedEventHandler(w_ExecuteQueryCompleted);
- }
- private void btnFind_Click(object sender, EventArgs e)
- {
- string sql = "select * from test";
- w.ExecuteQueryAsync(sql); //呼叫對應非同步方法
- ChangeStatus(true);
- }
- void w_ExecuteQueryCompleted(object sender, WMS.ExecuteQueryCompletedEventArgs e)
- {
簡單範例
假設在web service中定義了一個資料查詢的方法:
- [WebMethod]
- public DataSet ExecuteQuery(string SQL)
- {
- using (OracleConnection conn = new OracleConnection(connstrSQL))
- {
- try
- {
- conn.Open();
- OracleCommand cmd = new OracleCommand(sql,conn);
- OracleDataAdapter ada = new OracleDataAdapter(cmd);
- DataSet ds = new DataSet();
- ada.Fill(ds);
- return ds;
- }
- catch (OracleException ex)
- {
- throw new Exception(ex.Message);
- }
- finally
- {
- conn.Close();
- }
- }
客戶端:
- ///說明:
- ///panel1中放置了動態載入字樣的圖 片等
- ///
- public partial class frmStock : Form.
- {
- Service.MyService w = new Service.MyService(); //呼叫web service
- public frmStock()
- {
- InitializeComponent();
- }
- private void frmStock_Load(object sender, EventArgs e)
- {
- //新增非同步方法執行後觸發事件
- w.ExecuteQueryCompleted += new WMS.ExecuteQueryCompletedEventHandler(w_ExecuteQueryCompleted);
- }
- private void btnFind_Click(object sender, EventArgs e)
- {
- string sql = "select * from test";
- w.ExecuteQueryAsync(sql); //呼叫對應非同步方法
- ChangeStatus(true);
- }
- void w_ExecuteQueryCompleted(object sender, WMS.ExecuteQueryCompletedEventArgs e)
- {
- DataTable dt= e.Result.Tables[0]; //獲得執行結果 e
- ChangeStatus(false);
- if (dt.Rows.Count <= 0)
- {
- MessageBox.Show("沒有資料", "information", MessageBoxButtons.OK, MessageBoxIcon.Information);
- return;
- }
- gvshow.AutoGenerateColumns = false;
- gvshow.DataSource = dt;
- }
- private void btnExit_Click(object sender, EventArgs e)
- {
- this.Close();
- }
- private void ChangeStatus(bool sign)
- {
- panel1.Visible = sign;
- }
- }
這樣,可以
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命令提示視窗,如下作業:
d:\Program Files\Microsoft Visual Studio 8\SDK\v2.0>wsdl http://localhost/Serve/Service.asmx?wsdl
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'd:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Service.cs'.其中service.cs就是生成的代理類,開啟可見,其中涉及到非同步方法,事件的生成。(部分程式碼如下)
- ///
- public event HelloWorldCompletedEventHandler HelloWorldCompleted;
- ///
- public event showInfoCompletedEventHandler showInfoCompleted;
- ///
- [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)]
- public string HelloWorld() {
- object[] results = this.Invoke("HelloWorld", new object[0]);
- return ((string)(results[0]));
- }
- ///
- public System.IAsyncResult BeginHelloWorld(System.AsyncCallback callback, object asyncState) {
- return this.BeginInvoke("HelloWorld", new object[0], callback, asyncState);
- }
- ///
- public string EndHelloWorld(System.IAsyncResult asyncResult)
- {
- object[] results = this.EndInvoke(asyncResult);
- return ((string)(results[0]));
- }
- ///
- public void HelloWorldAsync() {
- this.HelloWorldAsync(null);
- }
- ///
- public void HelloWorldAsync(object userState) {
- if ((this.HelloWorldOperationCompleted == null)) {
- this.HelloWorldOperationCompleted = new System.Threading.SendOrPostCallback(this.OnHelloWorldOperationCompleted);
- }
- this.InvokeAsync("HelloWorld", new object[0], this.HelloWorldOperationCompleted, userState);
- }
- private void OnHelloWorldOperationCompleted(object arg) {
- if ((this.HelloWorldCompleted != null)) {
- System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
- this.HelloWorldCompleted(this, new HelloWorldCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
- }
- }
- ///
- ///
4.通過csc命令把service.cs生成為dll檔案
5.在專案中新增對此dll的引用
6.這樣對此dll的應用實際上就是通過這個代理類訪問我們釋出的web service.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-663016/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- tornado原理介紹及非同步非阻塞實現方式非同步
- WebRTC 音視訊同步原理與實現Web
- Java實現非同步呼叫Java非同步
- 如何使用ABSL程式碼呼叫Web serviceWeb
- 同步、非同步、阻塞與非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- python中非同步非阻塞如何實現Python非同步
- 【RocketMQ】主從同步實現原理MQ主從同步
- 教你如何用 Java 實現非同步呼叫Java非同步
- Dubbo原始碼分析(十)同步呼叫與非同步呼叫原始碼非同步
- 介面呼叫超時的實現原理
- Vue2非同步批量更新與computed、watcher原理實現Vue非同步
- 淺談JavaScript非同步發展與Promise/A+原理實現JavaScript非同步Promise
- 直播原理與web直播實戰Web
- Web 端 APNG 播放實現原理Web
- 教你實現快應用storage介面同步呼叫
- maven非web專案整合mbatis實現CRUDMavenWebBAT
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- Lombok 原理與實現Lombok
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- Spring Boot中如何優雅地實現非同步呼叫?Spring Boot非同步
- Web SSH 的原理與在 ASP.NET Core SignalR 中的實現WebASP.NETSignalR
- 熔斷原理與實現
- InlineHook & 原理與實現(3)inlineHook
- @weakify 與 @strongify 實現原理
- 堆的原理與實現
- 深入xLua實現原理之Lua如何呼叫C#C#
- 深入xLua實現原理之C#如何呼叫LuaC#
- C#非同步程式設計:原理與實踐C#非同步程式設計
- 小白都會的rsync遠端同步原理及-------(定期同步與rsync+inotify實時同步)實驗
- 非同步神器:CompletableFuture實現原理和使用場景非同步
- 程式與執行緒、同步與非同步、阻塞與非阻塞、併發與並行執行緒非同步並行
- Redis核心原理與實踐--列表實現原理之ziplistRedis
- memcached分散式原理與實現分散式
- React基礎與原理實現React
- vysor原理與程式碼實現
- 深入解析 ResNet:實現與原理
- [SentencePiece]Tokenizer的原理與實現