【问题标题】:C# HttpClient tracing stuckC# HttpClient 跟踪卡住
【发布时间】:2017-02-22 06:06:41
【问题描述】:

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

在我的控制器里面我有这段代码

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);

有人可以点亮并解释为什么它卡住了吗?
感谢任何帮助:)

【问题讨论】:

  • 在哪里调用 LoggingHandler.SendAsync ?在 ASP.Net 中,await/async 模式有一些限制 - 我假设你在某个地方遇到了死锁。
  • 我正在创建 LoggingHandler type var log = new LoggingHandler();我正在创建 httpclient(log)
  • 我明白了,但是您在控制器中调用 PostAsync,而不是 SendAsync。正如 Nkosi 所说,在可等待方法上调用 .Result(或任何阻塞方法或属性)在 ASP.Net 中非常糟糕,并且大部分时间都会导致死锁。

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


【解决方案1】:

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

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

这就是导致死锁的原因。

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

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

【讨论】:

  • 我将代码行更改为您的,但我的函数不是异步 1,它是操作结果 public ActionResult TestApiRegistration()
  • 无法编辑。它是动作结果类型的方法。我应该将其更改为异步方法吗?
  • 是的。更改为async Task&lt;ActionResult&gt; 返回类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多