4

我知道这个问题之前已经解决了,但我有服务返回这样的字符串。

[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");

问题是当我添加参考时,我无法获得 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 方法,为什么我会收到上述错误?

谢谢你的时间。

4

2 回答 2

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 中显然存在 hack(它可能不再可用)。有关更多信息,请参阅此 MS Connect 案例:

Web 应用程序项目中未生成的开始/结束异步 Web 服务代理方法

我的建议是接受新方法。

于 2010-10-14T11:17:16.763 回答
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.");
    }
于 2010-10-15T11:36:56.403 回答