У меня есть проблема, о которой я не смог найти никакой информации.
У меня есть API (размещенный в Azure), у которого одна конечная точка ведет себя совершенно иначе, чем остальные, в основном этот метод зависает, новсе остальные работают нормально.
Этот метод не делает ничего особенного, чем любой другой.
Что происходит так: 1) Внешний (вне лазурного) вызова к моемуконечная точка.2) Я выполняю этот вызов (я вхожу в систему и вижу это).3) Я делаю вызов зависимости к другой системе (за пределами лазури).Этот вызов передается как хорошо в понимании, но выполнение никогда не возвращается к моему коду.Перед добавлением тайм-аута я просто зависаю, но с добавлением тайм-аута я тайм-аут.4) Ничего не регистрируется в выводах после вызова зависимости, и поскольку запрос не завершен, сам запрос не регистрируется.
Дело в том, что я использую класс RestHelper, который использует HttpClient, и все мои вызовы зависимости используют этотот же класс.Каждый второй звонок, который я делаю, работает нормально.Этот конкретный вызов никогда не возвращает выполнение в мой код.Ранее я использовал WebRequest, и он отлично работает, поэтому во внешней системе, которую я вызываю, нет ничего плохого.
После перехода на HttpClient все работает асинхронно, но я не пропустил ожидание этого конкретного вызова.
Поскольку я добавил тайм-аут, я, по крайней мере, сейчас получаю запись в журналах IIS, но они говорят только тайм-аут.
Я пробежал, пытаясь понять, насколько это возможно, и у меня больше нетЯ знаю, какие пути искать, поэтому я отчаянно нуждаюсь в помощи.
public async Task<Response> ValidateUser(ValidateUser validateUser)
{
var user = _userRepository.GetUser(validateUser.Id, false);
if (user?.UserId == null)
{
throw new IntegrityException("Failed to get user.", Infrastructure.ErrorHandling.ErrorCodes.UserAlreadyValidated);
}
var account = GetAccountByUserId(user.UserId.Value, _accountRepository);
validateUser.Id = account.AccountId;
_logManager.Log("Validation -> Crm.");
User validatedUser = null;
try
{
validatedUser = await _userController.ValidateEmail(validateUser); // <-- This call hangs
}
catch (Exception e)
{
_logManager.Log(e.Message, SeverityLevel.Error);
throw;
}
...
}
public async Task<User> ValidateEmail(ValidateUser validateUser)
{
var url = validateUser.EntityType == EntityType.Contact
? $"{_url}/{Contacts}/{validateUser.Token}"
: $"{_url}/{Leads}/{validateUser.Token}";
var user = new User
{
Token = validateUser.Token,
InformationSource = InformationSource.ValidateEmail,
Id = validateUser.Id
};
return await _restHelper.Put<User, User>(url, user); // <-- This call hangs
}
public class RestHelper : IRestHelper
{
private static HttpClient _httpClient;
public async Task<TModelOut> Put<TModelOut, TModelIn>(string url, TModelIn data, IDictionary<string, string> headers = null)
{
return await Operation<TModelOut, TModelIn>(url, HttpMethod.Put, data, headers);
}
private async Task<TModelOut> Operation<TModelOut, TModelIn>(string uri, HttpMethod verb, TModelIn data, IDictionary<string, string> headers)
{
HttpResponseMessage response = null;
string body = null;
var responseBody = string.Empty;
HttpStatusCode httpStatusCode;
if (typeof(TModelIn) == typeof(string))
{
body = (string) Convert.ChangeType(data, typeof(string));
}
else
{
body = JsonConvert.SerializeObject(data);
}
var content = new StringContent(body);
content.Headers.ContentType = new MediaTypeHeaderValue(Constants.ContentType);
var httpRequestMessage = new HttpRequestMessage(verb, uri);
headers?.ToList().ForEach(h =>
{
if (httpRequestMessage.Headers.Contains(h.Key))
{
httpRequestMessage.Headers.Remove(h.Key);
}
httpRequestMessage.Headers.Add(h.Key, h.Value);
});
httpRequestMessage.Content = content;
response = await _httpClient.SendAsync(httpRequestMessage); // <-- This call hangs
HttpStatusCode statusCode = HttpStatusCode.PartialContent;
if (response?.Content != null)
{
responseBody = await response.Content?.ReadAsStringAsync();
statusCode = response.StatusCode;
}
_logManager.LogRequest(uri, verb.ToString(), responseBody, statusCode, data);
if (response != null && response.IsSuccessStatusCode)
{
if (typeof(TModelOut) == typeof(HttpResponseMessage))
{
return (TModelOut) Convert.ChangeType(response, typeof(TModelOut));
}
return await response.Content.ReadAsJsonAsync<TModelOut>();
}
}
...
}
Заранее благодарю за любую помощь.