У меня возникла проблема с получением ответа от API с моим кодом, запрос не истекает, и он не дает мне ответа вообще. Я сделал конечную точку api в своем собственном API, чтобы вернуть строку json, чтобы вручную опубликовать данные json с «Firefox Poster», и это работает отлично. С этим я считаю, что проблема находится где-то в моем коде.C# Flurl и HttpClient, никакого ответа от REST API
У меня есть C# WebAPI, который я разрабатываю для использования с угловым интерфейсом (это работает, это просто для истории). При вызове моего API я создаю объект «EnrollmentRequestDto»
public class EnrollmentRequestDto
{
/// <summary>
/// Context Information for the request. Contains the Ship-To, language code and timezone.
/// </summary>
[JsonProperty("requestContext")]
public RequestContextDto RequestContext { get; set; }
/// <summary>
/// Unique ID provided by DEP to reseller on provisioning DEP access. This would be the reseller's DEP ID if its posted by distributor OBO a reseller, and would be his own depResellerId if a reseller is posting for self.
/// </summary>
[JsonProperty("depResellerId")]
public string DepResellerId { get; set; }
/// <summary>
/// Unique transaction ID provided by the reseller
/// </summary>
[JsonProperty("transactionId")]
public string TransactionId { get; set; }
/// <summary>
/// List of orders in the transaction (limit 1000 per transaction)
/// </summary>
[JsonProperty("orders")]
public List<OrderDto> Orders { get; set; }
}
После этого создается объект, я отправить в мой класс RequestHandler и метод BulkEnrollRequest, который атм записывается с расширением HttpClient Flurl, который можно найти здесь: github
public IResponse BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
try
{
var result = _bulkEnrollUrl.PostJsonAsync(enrollmentRequest).ReceiveJson<SuccessResponse>();
result.Wait();
return result.Result;
}
catch (FlurlHttpTimeoutException)
{
throw new AppleTimeOutException();
}
catch (FlurlHttpException ex)
{
return _errorHandler.DeserializeFlurlException(ex);
}
}
Я также попытался это, чтобы убедиться, что ничего не происходит в Flurl (Это только для отладки до точки, где я хочу, чтобы получить ответ):
public async Task<IResponse> BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
var json = JsonConvert.SerializeObject(enrollmentRequest);
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await httpClient.PostAsync(_bulkEnrollUrl, new StringContent(json, Encoding.UTF8, "application/json"));
return new SuccessResponse();
}
И код замерзает в точке ожидания, и ничего не происходит. Я попытался установить точку останова после BulkEnrollRequest, чтобы он никогда не покидал этот метод.
Теперь вот для забавной части: он работал, когда я работал над ErrorHandler, и в какой-то момент API просто переставал отвечать. Wireshark показывает, что запрос делается ... поэтому я застрял.
Любая помощь приветствуется.
EDIT
Это теперь работает! Я реализовал async полностью от контроллера API до RequestHandler, а затем ожидал каждого вызова. Для справки:
public async Task<IResponse> BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
try
{
var result = await _bulkEnrollUrl.PostJsonAsync(enrollmentRequest).ReceiveJson<SuccessResponse>();
return result;
}
catch (FlurlHttpTimeoutException)
{
throw new AppleTimeOutException();
}
catch (FlurlHttpException ex)
{
return _errorHandler.DeserializeFlurlException(ex);
}
}
Скачать стельку и сравнить ваш запрос HTTP с одним «Firefox Poster» посылает – Eser
Спасибо за комментарий, я сделал именно это, и я не могу найти что-нибудь странное с запросом. Однако я с Fiddler обнаружил, что получаю ответ от API, который точно соответствует «SuccessResponse», который я идентифицировал в коде. Думаю, я тоже видел трассировку Wireshark, и движение выглядит немного странным. Нет очевидного RST или FIN ACK, рассказывающего мне, что сделка завершена ... – Miwca