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

より詳しい情報:

BeginXXX/EndXXXVisual Studio 2005 以降、Add Web Reference プロキシ ジェネレーターはメソッドを作成しなくなりました。これらのメソッドは、XXXAsync/XXXCompletedパターンを支持して廃止されました。

BeginXXX/EndXXXスタイルの非同期メソッドを使用する必要がある場合は、次のいずれかの方法を使用できます。

  1. ツールを使用WSDL.exeしてプロキシを作成します。例えば:

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

    生成されたMyService.csファイルをプロジェクトに含め、Web 参照の代わりにそれを使用します。.NET Framework SDK バイナリがパスに含まれるように、Visual Studio コマンド プロンプトを開く必要があります。

  2. どうやら Visual Studio にハックがあるようです (使用できなくなった可能性があります)。詳細については、次の MS Connect ケースを参照してください。

Begin/End Async WebService プロキシ メソッドが 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 に答える