2010-10-14 78 views
4

我知道這已被解決之前,但我有服務,返回一個像這樣的字符串。異步web服務調用。無(Begin ...)方法可用!

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
[System.Web.Script.Services.ScriptService] 
public class MyService : System.Web.Services.WebService 
{ 

    [WebMethod] 
    public string Hello() 
    { 
     System.Threading.Thread.Sleep(10000); 
     return "Hello User"; 
    } 
} 

我讀過很多例子是說我需要調用的方法是這樣的:

 MyService my = new MyService(); 
     AsyncCallback async = new AsyncCallback(callback); 
     my.BeginHello(); 
     Console.WriteLine("Called webservice"); 

的事情是,當我說我參考拿到coudn't的BeginHello方法。我看到的只是HelloAsync。所以我在我的控制檯應用程序中使用它。

 MyService my = new MyService(); 
     AsyncCallback async = new AsyncCallback(callback); 
     my.HelloAsync(); 
     Console.WriteLine("Called webservice"); 

和定義如下

private void callback(IAsyncResult res) 
    { 
     Console.Write("Webservice finished executing."); 
    } 

私人回調方法,在此過程中,我得到這樣的錯誤:

的對象引用需要 非靜態字段,方法或 屬性 'AsyncWebserviceCall.Program.callback(System.IAsyncResult)

爲什麼我不能得到BeginHello方法&爲什麼我得到如上的錯誤?

謝謝你的時間。

+0

請向我們展示整個類(回調和調用web服務的方法) – jgauffin 2010-10-14 11:06:59

回答

9

如果代碼被你public static void Main(string[] args)函數內部運行,那麼你需要做private void callback(IAsyncResult res)靜態方法:

private static void callback(IAsyncResult res) 
{ 
    Console.Write("Webservice finished executing."); 
} 

這就是爲什麼你得到錯誤。

從ASP.NET 2.0開始,您對如何進行異步Web服務調用進行了一些更改。做到這一點,而不是:

MyService my = new MyService(); 
my.HelloCompleted += CallBack; 
my.HelloAsync(); 
Console.WriteLine("Called service."); 
Console.ReadLine(); // Wait, otherwise console app will just exit. 

你的回調方法的簽名更改爲:

private static void CallBack(object sender, HelloCompletedEventArgs e) 
{ 
    Console.WriteLine("Webservice finished executing."); 
} 

更多信息:

在Visual Studio 2005年起添加Web引用代理生成器不再創建BeginXXX/EndXXX方法。這些方法已被棄用,以支持XXXAsync/XXXCompleted模式。

如果你真的需要,你可以使用以下方法之一BeginXXX/EndXXX風格異步方法的工作:

  1. 使用WSDL.exe工具來創建代理。例如:

    wsdl.exe /out:MyService.cs http://somedomain.com/MyService.asmx?wdsl

    包括生成的MyService.cs文件在您的項目並使用它的Web引用。您需要爲此打開Visual Studio命令提示符,以便.NET Framework SDK二進制文件位於您的路徑中。

  2. 在Visual Studio中顯然存在黑客攻擊(它可能不再可用)。欲瞭解更多信息請參閱本MS連接情況:

Begin/End Async WebService Proxy Methods Not Generated in Web Application Projects

我的建議是去擁抱新的方法。

+0

謝謝。這解決了一個問題。那麼缺少BeginHello方法呢? – user20358 2010-10-14 11:19:24

+0

謝謝凱夫。所以你說的是ASP.NET 2.0以後,他們將{Begin ...}前綴移除到異步調用? – user20358 2010-10-14 12:18:47

+0

我不認爲這條線會起作用:my.HelloCompleted + = CallBack;我會添加一個讓我感覺得到的東西。同時這個傢伙有兩種方法可用? http://www.codeproject.com/Articles/70441/Calling-Web-Service-Functions-Asynchronously-from-.aspx – user20358 2010-10-14 12:19:08

2

這是我在客戶端更改以使其工作。

static void Main(string[] args) 
    { 
     MyService my = new MyService(); 
     my.HelloCompleted +=new HelloCompletedEventHandler(my_HelloCompleted); 
     my.HelloAsync(); 
     Console.WriteLine("Called webservice"); 
     Console.ReadKey(); 

    } 

    private static void my_HelloCompleted(object sender, HelloCompletedEventArgs e) 
    { 
     Console.Write("Webservice finished executing in my_HelloCompleted."); 
    } 
+0

很高興你的工作。 :)從C#2.0開始,你不需要指定'new HelloCompletedEventHandler'。只要:'my.HelloCompleted + = my_HelloCompleted'。 – Kev 2010-10-15 12:13:55

+0

謝謝凱夫。將嘗試一下。 :) – user20358 2010-10-19 11:30:01