请求不退回

时间:2018-10-05 13:47:30

标签: .net azure httpclient

我有一个问题,无法找到有关的任何信息。

我有一个api(以azure托管),该api的一个端点的行为与其余端点的行为截然不同,基本上该方法可以挂起,但其余所有端点都能正常工作。

此方法与其他方法没有什么不同。

这是怎么回事: 1)到我的端点的外部呼叫(天蓝色之外)。 2)我进行了调用(我登录到见解并可以看到)。 3)我对另一个系统(azure之外)进行了依赖项调用。在洞察力方面,此呼叫被认为是可以的,但执行永远不会返回我的代码。在添加超时之前,我只是挂起,但是由于添加了超时,所以我超时了。 4)依赖项调用后,洞察力中未记录任何内容,并且由于请求未完成,因此请求本身未记录。

问题是,我使用了一个使用HttpClient的RestHelper类,而我的所有依赖项调用都使用了同一类。我打的其他电话都正常。这个特定的调用永远不会使执行返回我的代码。我以前使用过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>();
        }
    }

    ...

 }

在此先感谢您的帮助。

0 个答案:

没有答案