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 方法并一直等待调用树 - 无济于事。