Запрос не возвращается - PullRequest
       4

Запрос не возвращается

0 голосов
/ 05 октября 2018

У меня есть проблема, о которой я не смог найти никакой информации.

У меня есть 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>();
        }
    }

    ...

 }

Заранее благодарю за любую помощь.

...