我有一个问题,无法找到有关的任何信息。
我有一个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>();
}
}
...
}
在此先感谢您的帮助。