私の要求/応答を記録したいが問題がある。 私の要求は、なぜ私は分かりませんでした。私のコントローラ内部C#HttpClient tracing stuck
私はこのコード
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パターンにいくつかの制限があります。どこかでデッドロックが発生していると思います。 – gobes
LoggingHandlerタイプのログを作成しています。 var log = new LoggingHandler(); と私はhttpclient(ログ)を作成して – Bglen
私はそれを参照してください、しかしあなたのコントローラで 'SendAsync'ではなく' PostAsync'を呼び出しています。 Nkosi氏によると、待たされるメソッドで '.Result'(またはブロッキングメソッドやプロパティ)を呼び出すことは、ASP.Netでは非常に悪く、ほとんどの時間がデッドロックにつながります。 – gobes