Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步Web服务调用。没有可用的(开始…)方法!_C#_.net_Asynchronous_Webservice Client - Fatal编程技术网

C# 异步Web服务调用。没有可用的(开始…)方法!

C# 异步Web服务调用。没有可用的(开始…)方法!,c#,.net,asynchronous,webservice-client,C#,.net,Asynchronous,Webservice Client,我知道这个问题以前已经被解决过,但我有一个服务返回一个类似这样的字符串 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [System.Web.Script.Services.ScriptService] public class MyService : System.Web.Services.WebService { [We

我知道这个问题以前已经被解决过,但我有一个服务返回一个类似这样的字符串

[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方法。我所看到的只是地狱般的同步。所以我在我的控制台应用程序中就是这样使用它的

        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.");
    }
这样做时,我会得到如下错误:

        MyService my = new MyService();
        AsyncCallback async = new AsyncCallback(callback);
        my.BeginHello();
        Console.WriteLine("Called webservice");
需要一个对象引用 非静态字段、方法或 财产 'AsyncWebserviceCall.Program.callback(System.IAsyncResult)

为什么我得不到BeginHello方法&为什么我会得到上述错误


谢谢您的时间。

如果代码在
公共静态无效主函数(字符串[]args)
中运行,则需要将
私有无效回调(IAsyncResult res)
设置为静态方法:

private static void callback(IAsyncResult res)
{
    Console.Write("Webservice finished executing.");
}
这就是为什么你会犯这样的错误

从ASP.NET2.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.");
}
更多信息:

从VisualStudio2005开始,“添加Web引用代理生成器”不再创建
BeginXXX/EndXXX
方法。这些方法被弃用,取而代之的是
XXXAsync/XXXCompleted
模式

如果确实需要使用
BeginXXX/EndXXX
样式的异步方法,可以使用以下方法之一:

  • 使用该工具创建代理。例如:

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

    在项目中包含生成的
    MyService.cs
    文件,并使用该文件而不是Web引用。您需要为此打开Visual Studio命令提示符,以便.NET Framework SDK二进制文件位于您的路径中

  • Visual Studio中显然存在黑客攻击(可能不再可用)。有关更多信息,请参阅此MS Connect案例:


  • 我的建议是接受新的方法。

    以下是我在客户端所做的更改,以使其正常工作

        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.");
        }
    

    请向我们展示整个类(回调和调用Web服务的方法),谢谢。这解决了一个问题。缺少的BeginHello方法呢?谢谢Kev。你是说ASP.NET 2.0以后,他们删除了异步调用的{Begin…}前缀?我认为这行行不通:my.HelloCompleted+=CallBack;我将添加一个aswer shwo我做了什么,使它工作。同时,这家伙怎么能同时使用这两种方法呢?很高兴你让它工作了。:)从C#2.0开始,您不需要指定新的HelloCompletedEventHandler。只要做:
    my.HelloCompleted+=my\u HelloCompleted
    。谢谢Kev。我会试试看。:)