ASP.Net Forms HttpClient PostAsync没有响应,也没有错误信息。

4
我有这段代码:
using (var client = new HttpClient())
{
    var values = new Dictionary<string, string>
        {
            {"site_id","001"},
            {"apikey","abc01201az1024"},
            {"trans_id","45364136"},
        };

    // Get the parameters in the url encoded format
    var content = new FormUrlEncodedContent(values);

    //Send request
    var response = await client.PostAsync(url, content);

    DataRoot<Transaction> outPut = null;
    if (response.IsSuccessStatusCode)
    {
        //Get Response
        var result = await response.Content.ReadAsStringAsync();
        JsonConvert.DeserializeObject<DataRoot<Transaction>>(result);
    }

    return outPut;
}

在调试模式下,该代码在这个阶段不会产生任何响应,没有错误代码但停止运行:
//Send request
var response = await client.PostAsync(url, content);

在那一行,应用程序会停顿几秒钟,然后停止。代码不会进入下一行。 - Jmocke
我确实使用了响应对象,但由于在那一行代码处进程停止运行,应用程序无法到达其他代码行。 - Jmocke
让我为您更新帖子。 - Jmocke
能否同时发布 REST API 方法代码呢? - Developer
我正在使用这种方法向Web服务发送请求。 - Jmocke
显示剩余3条评论
3个回答

3

像这样使用await可能会导致死锁。

您可以在异步方法中使用ConfigureAwait(false)来防止这种死锁。

将代码更新为:

var response = await client.PostAsync(url, content).ConfigureAwait(false);

这将解决问题。

2

可能有更好的方法,但这解决了我的问题。使用wait从另一个方法调用您的方法:

public static async Task<string> AuthenticateUser()
{
    var t = Task.Run(() => ClassObject.AuthenticateUser("me"));
    t.Wait();

    Console.WriteLine(t.Result);
    Console.ReadLine();
    return "ok";
}

-2

你确定它实际上没有返回响应并继续执行吗?因为client.PostAsync()调用是等待执行的,所以执行可能会在不同的线程上继续。因此,如果你只是逐行调试(通过F10或类似方式),它可能看起来这个方法从未返回;实际上整个方法已经执行完毕,你的程序正在运行。

你可能需要在该方法中添加另一个断点(在PostAsync方法调用之后)。当PostAsync方法在不同的线程上返回时,你的调试器应该会命中下一个断点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接