асинхронный вызов веб-сервиса.Нет (Begin ...) метод доступен! - PullRequest
4 голосов
/ 14 октября 2010

Я знаю, что это уже решалось, но у меня есть служба, которая возвращает строку, подобную этой.

[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& Почему я получаю эту ошибку, как указано выше?

Спасибо за ваше время.

Ответы [ 2 ]

9 голосов
/ 14 октября 2010

Если код выполняется внутри вашей функции 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 были внесены некоторые изменения в способ выполнения вызовов асинхронных веб-служб. Сделайте это вместо:

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, генератор прокси Add Web Reference больше не создает методы BeginXXX/EndXXX. Эти методы устарели в пользу паттерна XXXAsync/XXXCompleted.

Если вам действительно нужно работать с асинхронными методами в стиле BeginXXX/EndXXX, вы можете использовать один из следующих методов:

  1. Используйте инструмент WSDL.exe для создания прокси. Например:

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

    Включите сгенерированный файл MyService.cs в свой проект и используйте его вместо веб-ссылки. Для этого необходимо открыть командную строку Visual Studio, чтобы двоичные файлы .NET Framework SDK находились на вашем пути.

  2. Очевидно, в Visual Studio есть хак (он может быть недоступен). Для получения дополнительной информации см. Этот случай MS Connect:

Начало / конец Методы асинхронного прокси-сервера WebService, не созданные в проектах веб-приложений

Мой совет - принять новый подход.

2 голосов
/ 15 октября 2010

Вот что я изменил на стороне клиента, чтобы заставить его работать.

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