Web Service 異步調用
最近在完成一些與Socket 通訊相關的東西,希望能夠將Socket 通訊的結果以Web Service 的形式發佈出來,但是由於Socket 通訊是異步的,所以想當然的認爲Web Service 應該異步返回,於是去搜索了一些資料。收集回來才發現有誤。但是卻是很好的例子代碼,現摘錄如下:
在.net1.x中,異步WebService異步調用的一般方式爲調用方法XX對應的BeginXX方法來完成,其過程類似於異步委託的使用。
體驗.NET 2.0的優雅之異步Web服務調用
在.net2.0中(準確的說是vs.net 2005中),異步WebService異步調用的方式的例子:
void DoSomethingTest()
{
localhost.Service service = new WindowsApp.localhost.Service();
service.HelloWorldCompleted += new WindowsApp.localhost.HelloWorldCompletedEventHandler(service_HelloWorldCompleted);
// do Asyn calling here
service.HelloWorldAsync();
}
void service_HelloWorldCompleted(object sender, WindowsApp.localhost.HelloWorldCompletedEventArgs e)
{
if (e.Error == null)
{
MessageBox.Show(e.Result);
}
else
{
MessageBox.Show(e.Error.Message);
}
}
服務器端代碼
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld() {
return "Hello public Service () {}
World";
}
}
很簡單,沒有了AsyncCallback、IAsyncResult 這兩個煩人的東西,調用的代碼變得簡潔、優雅了,而且可以從e.Result得到強類型的返回值(上例爲"Hello World")。但是,有興趣的話,可以看看vs.net2005生成的Referance.cs文件,那可比2003中的複雜很多。其中可以看到 System.ComponentModel.AsyncCompletedEventArgs 、 System.Threading.SendOrPostCallback(delegate)這兩個在 .net 1.x 中沒有的“怪物”,估計用到的地方還不止WebService客戶端。