【问题标题】:Soap api methods are not returning anything / Status; waiting for activationSoap api 方法没有返回任何东西/状态;等待激活
【发布时间】:2020-02-26 21:34:06
【问题描述】:

我正在开发应该与soap api 通信的小型应用程序。

代码如下:

namespace Demo1._0
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                makeSoapCall();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        public static void makeSoapCall()
        {
            EnventoryWebserviceClient client = new EnventoryWebserviceClient();
            client.ClientCredentials.UserName.UserName = "some@thing.com";
            client.ClientCredentials.UserName.Password = "somePass!";

            var method1 = client.contentReportAsync();
            var method2 = client.deleteSoapFlagsAsync();
            var method3 = client.getSoapFlagsAsync();
        }
    }
}

这里的问题是我无法从该方法获得任何响应,客户端已成功连接并且我没有收到任何异常。

当我调试它时,我可以看到以下信息:

我对编程很陌生,这里有什么“问题”?我该如何解决这个问题?

提前致谢

附言

我试图等待他们,但我不知道如何在Main 方法中调用此方法,因此我必须将makeSoapCall 方法声明为async

干杯

【问题讨论】:

  • 看起来这些方法返回一个任务。您可以尝试 await client.contentReportAsync() 或将它们添加到列表中并等待所有?
  • 如果 contentReportAsync,deleteSoapFlagsAsync 和 getSoapFlagsAsync 异步,那么您需要等待它们(参见docs.microsoft.com/en-us/dotnet/csharp/language-reference/…

标签: c# .net-core async-await task-parallel-library soap-client


【解决方案1】:

您在 SOAP api 中调用异步方法。 异步方法的行为与同步方法不同,这意味着异步方法默认情况下不会等待结果,直到它移动到下一行。

下面有两种处理异步方法的方法。

第一种方法:

这是使您的异步方法表现得像同步方法一样的最直接的方法。因为“等待”将确保您在继续下一行之前获得结果。

第二种方法:

如果每个方法都需要一段时间才能调用,您可以并行运行它们。 这意味着如果每个方法都需要 7 秒,那么您不必等待 21 秒直到所有方法都完成。

相反,您可以同时启动呼叫,总共只等待 7 秒。

// First Method
var method1 = await client.contentReportAsync();
var method2 = await client.deleteSoapFlagsAsync();
var method3 = await client.getSoapFlagsAsync();

// Second Method
var method1 = client.contentReportAsync();
var method2 = client.deleteSoapFlagsAsync();
var method3 = client.getSoapFlagsAsync();

Task[] tasks = { method1, method2, method3 };
await Task.WhenAll(tasks);

// To access the result in this way, use ".Result"
var result = method1.Result;

您的完整代码示例可能如下所示(注意方法声明中的异步):

namespace Demo1._0
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                await makeSoapCall();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        public async static void makeSoapCall()
        {
            EnventoryWebserviceClient client = new EnventoryWebserviceClient();
            client.ClientCredentials.UserName.UserName = "some@thing.com";
            client.ClientCredentials.UserName.Password = "somePass!";

            var method1 = await client.contentReportAsync();
            var method2 = await client.deleteSoapFlagsAsync();
            var method3 = await client.getSoapFlagsAsync();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2013-12-11
    • 2015-02-11
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多