【发布时间】: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