【问题标题】:How to properly use SendDataAsync method defined on the web service using Microsoft WCF Web Service Reference Provider client?如何使用 Microsoft WCF Web 服务参考提供程序客户端正确使用在 Web 服务上定义的 SendDataAsync 方法?
【发布时间】:2020-05-27 17:07:07
【问题描述】:

我可以访问包含 SendDataAsync 方法的特定 .asmx Web 服务的 WSDL 文件 - 基本上我指定了要发送的时间戳和值。我将 WSDL 文件作为连接服务上传到 Visual Studio 2019 中的项目(添加->连接服务->Microsoft WCF Web 服务参考提供程序->浏览->我添加了 WSDL 文件的位置并指定了包含 SendDataAsync 方法的服务)。之后我创建了一个新客户端并尝试使用我的方法:

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

不幸的是,它不起作用。我没有收到任何错误或异常,因此我尝试通过 Fiddler 检查来自 Web 服务的响应。我发现实际上没有任何东西被传输。没有建立任何联系,什么都没有。现在我试着理解我做错了什么。我使用网络服务上定义的方法的方式是错误的吗?或者,也许该方法实际上并没有像名字所暗示的那样做?或者问题可能与该方法是异步的事实有关?欢迎任何建议! :)

【问题讨论】:

  • 为什么这个问题被标记为webclient
  • 既然你标记了问题async-await,你是不是忘了await
  • 你是对的,它实际上不是一个正确的标签,我会编辑它。感谢await 的建议,非常有帮助!

标签: c# web-services wcf async-await


【解决方案1】:

根据你的描述,我做了一个demo。demo中的异步方法是客户端根据SendData自动生成的,即服务端没有SendDataAsync方法,服务端只有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();

这是客户端调用异步方法。

这是客户端调用后服务端的执行结果。

另外一种情况,如果你的异步方法是服务端实现的,那么服务端实现异步操作的方式有3种:基于任务的异步模式、基于事件的异步模式、IAsyncResult异步模式。对于服务端使用的异步模型不同,客户端调用的方式也不同。

以下链接详细介绍了客户端的异步调用:

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

【讨论】:

    【解决方案2】:

    好的,感谢 Paulo Morgado 的评论和丁鹏的回答,我设法解决了我的问题。使用异步方法的正确方法,例如我的 SendDataAsync,是使用 await 运算符。我将方法调用从:

    client.SendDataAsync(sd);

    到:

    response = await client.SendDataAsync(sd);

    我还必须将void Main 更改为async Main,并且该方法现在有效:)

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多