WebClient UploadStringTaskAsync 无一例外地失败

PBM*_*eIt 5 c# webclient async-await

我在我编写的一个安静的 Web API 2 发布方法上调用 UploadStringTaskAsync 并且它毫无例外地失败了。如果我将调用更改为 UploadString,它将按预期工作。我尝试了许多不同的方法。通过 UploadStringTaskAsync 尝试,Fiddler 确实显示了正在发布的帖子,但内容长度不匹配(见下文)。我正在从测试控制台应用程序中包含的类库运行此调用。.Net 4.5.2 到目前为止只是在 VS 2015 的调试模式下运行。这是我的代码:

private async Task PostLoggingItem(SmgLoggingItem loggingItem)
    {
        try
        {
            //using (WebClient client = new WebClient())
            //{
            //WebClient client = new WebClient();

                const string authToken = "mytoken";

                loggingItem.AuthToken = Encryptor.GenerateSecurityToken(authToken);

                client.Encoding = Encoding.UTF8;

                //client.Credentials = CredentialCache.DefaultNetworkCredentials;
                //client.UseDefaultCredentials = true;
                client.Credentials = new NetworkCredential("user","mypwd","mydom");

                // set content type to JSon
                client.Headers.Add("Content-Type", "application/json");

                var jsonItem = JsonConvert.SerializeObject(loggingItem);
            var response = await client.UploadStringTaskAsync(new Uri(ConfigurationManager.AppSettings["WebLogAPI"]), jsonItem);

            //string response = client.UploadString(new Uri(ConfigurationManager.AppSettings["SMGWebLogAPI"]), "POST", jsonItem);

            string result = JsonConvert.DeserializeObject<string>(response);

                if (result != "ok")
                {
                    await SMTPSendEmailAsync.SendEmail("brownp@spectrummg.com", "logging failed WebAPI call",
                        "Error return from WebAPI call in PostLoggingItem");
                }
                return;

            //}
        }
        catch (Exception e)
        {
            await SMTPSendEmailAsync.SendEmail("brownp@spectrummg.com", "logging failed WebAPI call",
                "Exception in PostLoggingItem" + e.Message);
            return;
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以看到我在哪里注释掉了可用的 UploadString 调用。此外,我有一个与 WebClient 对象的“生命周期”相关的理论问题,因此在方法中创建它(参见使用注释),但现在使用 PostLoggingItem 方法所属的对象实例化创建它。

这是小提琴手: 在此处输入图片说明

我肯定想知道为什么 Async 不起作用。此外,我使用了 aync 方法并一直等待调用树 - 无济于事。