创建Web Servicespan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffusing/span System.Web.Services; span stylecolor:#0000ffusing/span System.Threading; span stylecolor:#0000ffnamespace/span WebApplication1 { span stylecolor:#008000/// summary/span span stylecolor:#008000/// Summary description for WebService1/span span stylecolor:#008000/// /summary/span [WebService(Namespace span stylecolor:#006080http://tempuri.org//span)] [WebServiceBinding(ConformsTo WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(span stylecolor:#0000fffalse/span)] span stylecolor:#008000// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. /span span stylecolor:#008000// [System.Web.Script.Services.ScriptService]/span span stylecolor:#0000ffpublic/span span stylecolor:#0000ffclass/span WebService1 : System.Web.Services.WebService { [WebMethod] span stylecolor:#0000ffpublic/span span stylecolor:#0000ffstring/span HelloWorld() { Thread.Sleep(10 * 1000); span stylecolor:#0000ffreturn/span span stylecolor:#006080Hello World/span; } } } /span/span【注意】为了做异步调用的演示我这里简单地让该方法休眠了10秒钟后返回。创建客户端代理创建简单的界面来实施调用编写如下简单的代码span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffusing/span System; span stylecolor:#0000ffusing/span System.Windows.Forms; span stylecolor:#0000ffnamespace/span WindowsFormsApplication1 { span stylecolor:#0000ffpublic/span span stylecolor:#0000ffpartial/span span stylecolor:#0000ffclass/span Form1 : Form { span stylecolor:#0000ffpublic/span Form1() { InitializeComponent(); } localhost.WebService1 proxy span stylecolor:#0000ffnew/span localhost.WebService1(); span stylecolor:#0000ffprivate/span span stylecolor:#0000ffvoid/span button1_Click(span stylecolor:#0000ffobject/span sender, EventArgs e) { proxy.HelloWorldCompleted (obj, a) { MessageBox.Show(a.Result); }; proxy.HelloWorldAsync(); } span stylecolor:#0000ffprivate/span span stylecolor:#0000ffvoid/span button2_Click(span stylecolor:#0000ffobject/span sender, EventArgs e) { proxy.HelloWorldCompleted (obj, a) { MessageBox.Show(a.Result); }; proxy.HelloWorldAsync(); } } } /span/span【注意】这里两个按钮的事件是一模一样的。因为在一个窗体里面我们当然希望proxy是共用的推而广之甚至在整个应用程序都只有一个实例。然后在每个方法中调用它的一些方法。代码看起来很合理不是吗那么我们来看一下运行起来会怎么样Oooop,我们收到了一个错误一堆让你看得头疼甚至有些不知所云的错误消息对吧其实简单来说就是XML Web Service的机制不允许在一个异步请求没有返回之前再发起另外一个异步请求。这个其实与AJAX里面的机制有相似的。anyway我们如何解决这个问题呢2.采用多个proxy实例的做法来解决大家很容易想到的一个做法是既然一个Proxy不能同时发起多个异步调用那么创建多个不就可以了么span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffusing/span System; span stylecolor:#0000ffusing/span System.Windows.Forms; span stylecolor:#0000ffnamespace/span WindowsFormsApplication1 { span stylecolor:#0000ffpublic/span span stylecolor:#0000ffpartial/span span stylecolor:#0000ffclass/span Form1 : Form { span stylecolor:#0000ffpublic/span Form1() { InitializeComponent(); } /span/span
采用Web Service的标准做法
发布时间:2026/7/5 19:55:51
创建Web Servicespan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffusing/span System.Web.Services; span stylecolor:#0000ffusing/span System.Threading; span stylecolor:#0000ffnamespace/span WebApplication1 { span stylecolor:#008000/// summary/span span stylecolor:#008000/// Summary description for WebService1/span span stylecolor:#008000/// /summary/span [WebService(Namespace span stylecolor:#006080http://tempuri.org//span)] [WebServiceBinding(ConformsTo WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(span stylecolor:#0000fffalse/span)] span stylecolor:#008000// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. /span span stylecolor:#008000// [System.Web.Script.Services.ScriptService]/span span stylecolor:#0000ffpublic/span span stylecolor:#0000ffclass/span WebService1 : System.Web.Services.WebService { [WebMethod] span stylecolor:#0000ffpublic/span span stylecolor:#0000ffstring/span HelloWorld() { Thread.Sleep(10 * 1000); span stylecolor:#0000ffreturn/span span stylecolor:#006080Hello World/span; } } } /span/span【注意】为了做异步调用的演示我这里简单地让该方法休眠了10秒钟后返回。创建客户端代理创建简单的界面来实施调用编写如下简单的代码span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffusing/span System; span stylecolor:#0000ffusing/span System.Windows.Forms; span stylecolor:#0000ffnamespace/span WindowsFormsApplication1 { span stylecolor:#0000ffpublic/span span stylecolor:#0000ffpartial/span span stylecolor:#0000ffclass/span Form1 : Form { span stylecolor:#0000ffpublic/span Form1() { InitializeComponent(); } localhost.WebService1 proxy span stylecolor:#0000ffnew/span localhost.WebService1(); span stylecolor:#0000ffprivate/span span stylecolor:#0000ffvoid/span button1_Click(span stylecolor:#0000ffobject/span sender, EventArgs e) { proxy.HelloWorldCompleted (obj, a) { MessageBox.Show(a.Result); }; proxy.HelloWorldAsync(); } span stylecolor:#0000ffprivate/span span stylecolor:#0000ffvoid/span button2_Click(span stylecolor:#0000ffobject/span sender, EventArgs e) { proxy.HelloWorldCompleted (obj, a) { MessageBox.Show(a.Result); }; proxy.HelloWorldAsync(); } } } /span/span【注意】这里两个按钮的事件是一模一样的。因为在一个窗体里面我们当然希望proxy是共用的推而广之甚至在整个应用程序都只有一个实例。然后在每个方法中调用它的一些方法。代码看起来很合理不是吗那么我们来看一下运行起来会怎么样Oooop,我们收到了一个错误一堆让你看得头疼甚至有些不知所云的错误消息对吧其实简单来说就是XML Web Service的机制不允许在一个异步请求没有返回之前再发起另外一个异步请求。这个其实与AJAX里面的机制有相似的。anyway我们如何解决这个问题呢2.采用多个proxy实例的做法来解决大家很容易想到的一个做法是既然一个Proxy不能同时发起多个异步调用那么创建多个不就可以了么span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffusing/span System; span stylecolor:#0000ffusing/span System.Windows.Forms; span stylecolor:#0000ffnamespace/span WindowsFormsApplication1 { span stylecolor:#0000ffpublic/span span stylecolor:#0000ffpartial/span span stylecolor:#0000ffclass/span Form1 : Form { span stylecolor:#0000ffpublic/span Form1() { InitializeComponent(); } /span/span