Как правильно использовать метод SendDataAsyn c, определенный в веб-службе, с помощью клиента Microsoft WCF Web Service Reference Provider? - PullRequest
1 голос
/ 27 мая 2020

У меня есть доступ к WSDL-файлу определенной веб-службы c .asmx, которая содержит метод SendDataAsyn c - в основном я указываю TimeStamp и Value для отправки. Я загрузил файл WSDL в свой проект в Visual Studio 2019 в качестве подключенной службы (Add-> Connected Service-> Microsoft WCF Web Service Reference Provider-> Browse-> Я добавил расположение файла WSDL и указал службу, которая включала SendDataAsyn c метод). После этого я создал нового клиента и попытался использовать свой метод следующим образом:

ServiceSoapClient client = new ServiceSoapClient(ServiceSoapClient.EndpointConfiguration.ServiceSoap);
client.SampleData sd = new client.SampleData();
sd.TStamp = DateTime.Now;
sd.Value = 10;
client.SendDataAsync(sd);

К сожалению, он не работает. Я не получаю никаких ошибок или исключений, поэтому я попытался проверить ответ веб-службы через Fiddler. Выяснил, что на самом деле ничего не передается. Никакой связи не устанавливается, ничего. Теперь пытаюсь понять, что делаю не так. Я неправильно использую метод, определенный в веб-службе? Или, может быть, метод на самом деле не выполняет то, что предполагает название? Или проблема может быть связана с тем, что это метод Asyn c? Любые предложения приветствуются! :)

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Хорошо, благодаря как комментарию Пауло Моргадо, так и ответу Динг Пенг, мне удалось решить мою проблему. Правильный способ использования асинхронного метода, такого как SendDataAsyn c в моем случае, - с оператором await. Я изменил вызов метода с:

client.SendDataAsync(sd);

на:

response = await client.SendDataAsync(sd);

Мне также пришлось изменить void Main на async Main и теперь метод работает :)

0 голосов
/ 28 мая 2020

Согласно вашему описанию, я сделал демонстрацию. Асинхронный метод в демонстрации автоматически генерируется на стороне клиента в соответствии с SendData, то есть на стороне сервера нет метода SendDataAsyn c, а только на стороне сервера имеет SendData.

     public void SendData(SampleData data)
    {
        Console.WriteLine(data.TStamp);
        Console.WriteLine(data.value);
        Console.WriteLine("success");
    }

Это метод SendData на стороне сервера.

         public System.Threading.Tasks.Task SendDataAsync(Client_SOAP.ServiceReference1.SampleData data) {
        return base.Channel.SendDataAsync(data);
    }

Это асинхронный метод, автоматически сгенерированный на стороне клиента.

      ServiceReference1.Service1Client service1Client = new Service1Client();
        SampleData sampleData = new SampleData();
        sampleData.value = 10;
        sampleData.TStamp = DateTime.Now;
        service1Client.SendDataAsync(sampleData);
        service1Client.Close();
        Console.ReadLine();

Это асинхронные методы, вызывающие на стороне клиента.

enter image description here

Это результат выполнения на стороне сервера после стороны клиента вызовы.

В другом случае, если ваш асинхронный метод реализуется на стороне сервера, сервер может реализовать асинхронную операцию тремя способами: асинхронный шаблон на основе задач, асинхронный шаблон на основе событий, асинхронный шаблон IAsyncResult. Для другой асинхронной модели, используемой на стороне сервера, клиент вызывает по-разному.

Следующие ссылка подробно описывает асинхронный вызов на стороне клиента:

https://docs.microsoft.com/en-us/dotnet/framework/wcf/synchronous-and-asynchronous-operations

...