2015-09-10 7 views
6

У меня возникла проблема с получением ответа от 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); 
     } 
    } 
+0

Скачать стельку и сравнить ваш запрос HTTP с одним «Firefox Poster» посылает – Eser

+0

Спасибо за комментарий, я сделал именно это, и я не могу найти что-нибудь странное с запросом. Однако я с Fiddler обнаружил, что получаю ответ от API, который точно соответствует «SuccessResponse», который я идентифицировал в коде. Думаю, я тоже видел трассировку Wireshark, и движение выглядит немного странным. Нет очевидного RST или FIN ACK, рассказывающего мне, что сделка завершена ... – Miwca

ответ

2

Сейчас эта проблема решена. Я считаю, что причина, по которой трафик Wireshark выглядел настолько странным, был из-за тупика в коде, и тайм-аут был на моей стороне, а это означало, что я никогда не смогу FIN ACK получить информацию. Чтобы исправить это, я применил async ко всем методам, от контроллера до моего класса 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); 
     } 
    } 
+1

Рад видеть, что вы не отказались от Flurl;) –

0

Попробуйте этот код

Install-Package Microsoft.AspNet.WebApi.Client

using (var client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("http://localhost:9000/"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      HttpResponseMessage response = await client.PostAsJsonAsync("api/products", enrollmentRequest); 
      if (response.IsSuccessStatusCode) 
      { 
       var result = await response.Content.ReadAsAsync<T>(); 
      } 
     } 
+0

Он все еще зависает в ожидании. Это похоже на то, что мой код не может ответить каким-то образом :) – Miwca

Смежные вопросы