最近在忙些其他项目的事情,之前的MOSS 2010开发系列暂时搁一搁了。这个项目是传统的C/S架构,有客户端,有服务器。客户那边的环境还比较老,是Windows Server 2000. 很不幸的是,Windows Server 2000是不可以安装.NET Framework 3.5的(这个问题我之前也提到过),所以其实有很多东西得用比较早的技术去实现。一个典型的例子就是,在服务层的设计里面,我被迫放弃了WCF,而是采用了XML Web Service的方式。当然,咱对Web Service很熟悉,也很亲切。这不存在什么问题。
今天,要谈一个小问题,也是我们总结归纳出来在使用XML Web Service的场景下,如果需要并发地发起异步调用,而且是共享一个代理类的实例的话,可能出现的一些问题及其解决方法。记得很早之前某同学也跟我说到过这个问题,今天还是总结一下吧
闲话少说,我们来看一个例子吧
1. 采用Web Service的标准做法
创建Web Service
using System.Web.Services;
using System.Threading;
namespace WebApplication1
{
///
/// Summary description for WebService1
///
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
Thread.Sleep(10 * 1000);
return "Hello World";
}
}
}
【注意】为了做异步调用的演示,我这里简单地让该方法休眠了10秒钟后返回。
创建客户端代理
创建简单的界面来实施调用
编写如下简单的代码
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
localhost.WebService1 proxy = new localhost.WebService1();
private void button1_Click(object sender, EventArgs e)
{
proxy.HelloWorldCompleted += (obj, a) =>
{
MessageBox.Show(a.Result);
};
proxy.HelloWorldAsync();
}
private void button2_Click(object sender, EventArgs e)
{
proxy.HelloWorldCompleted += (obj, a) =>
{
MessageBox.Show(a.Result);
};
proxy.HelloWorldAsync();
}
}
}