C# HttpClient 跟踪卡住

标签 c# asp.net-mvc asynchronous async-await

我想记录我的请求/响应,但我遇到了问题。 我的请求卡在了某个点,我不知道为什么。

在我的 Controller 中我有这段代码

var log = new LoggingHandler();

using (var client = new HttpClient(log))// <-- problem here
{

    string baseUrl = ConfigurationManager.AppSettings["apiBaseAddress"];
    client.BaseAddress = new Uri(baseUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    foreach (var website in websitesList)
    {
        string stringtime = TimeHandler.GetCurrentDateTime();

        var userModel = new RegisterModel()
        {
           // my user model
        };

        var content = new FormUrlEncodedContent(new[]
       {
              //encoding model
        });



        try
        {
            HttpResponseMessage response = client.PostAsync("api/UserDetails/Register", content).Result;

            //tResult.URL = response.RequestMessage.RequestUri.OriginalString;
            tResult.URL = website.URL;
            tResult.Result = response.ReasonPhrase;

            var statusCode = response.StatusCode.ToString();

           .
           .
           .
           .
        }

        tResult.TestLog = log.GetLog();//*****

        resultList.Add(tResult);
    }
}

和我的 LoggingHandler

public class LoggingHandler : DelegatingHandler
{
    StringBuilder sb = new StringBuilder();

    public LoggingHandler()
        : base(new HttpClientHandler())
    {
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {

        sb.AppendLine("Request:");
        sb.AppendLine(request.ToString());
        if (request.Content != null)
        {
            sb.AppendLine(await request.Content.ReadAsStringAsync());
        }
        sb.AppendLine();

        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

        sb.AppendLine("Response:");
        sb.AppendLine(response.ToString());
        if (response.Content != null)
        {
            sb.AppendLine(await response.Content.ReadAsStringAsync());
        }
        sb.AppendLine();

        return response;
    }

    public string GetLog()
    {
        return sb.ToString();
    }
}

我的调试停留在:

HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

有人可以放一些灯并解释一下为什么卡住了吗?
感谢任何帮助:)

最佳答案

当您使用 .Result 时,您混合了同步和异步调用。

HttpResponseMessage response = client.PostAsync("api/UserDetails/Register", content).Result;

这就是造成死锁的原因。

要么一直异步,要么根本不异步。

var response = await client.PostAsync("api/UserDetails/Register", content);

关于C# HttpClient 跟踪卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40015528/

相关文章:

c# - 机器人框架 v4 : Stepcontext Option

jquery - MVC 4 创建可调整大小的列表框

asp.net-mvc - 指向单个网页的多个链接的优缺点

java - 将数据保存到Session时Spring Async函数异常

java - 一些 java 处理程序仅在结果可用时获取 url.openStream()

c# - 带驱动程序 C# 的 GroupBy Mongodb

c# - Linq to Entities EF4

c# - 从 .net 中的 HttpContext 检测 https?

html - 在 Html.DropDownList 的 <option> 下添加 html class 标签

java - 为什么我的方法不是异步的?