2015-09-10 1 views
6

Je rencontre un problème avec l'obtention d'une réponse d'une API avec mon code, la requête ne s'arrête pas et ne me donne aucune réponse. J'ai fait un point de terminaison api dans ma propre API pour retourner la chaîne json pour ensuite publier manuellement les données json avec "Firefox Poster" et ça marche très bien. Avec cela, je crois que le problème est quelque part dans mon code.C# Flurl et HttpClient, aucune réponse de l'API REST

J'ai obtenu un WebAPI C# que je suis en train de développer pour être utilisé avec un frontal Angular (Cela fonctionne, c'est juste pour l'histoire). Lorsque vous appelez mon API je crée l'objet « 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; } 
} 

Après cet objet est créé, j'envoie à mon RequestHandler de classe et la méthode BulkEnrollRequest qui atm est écrit avec l'extension HttpClient Flurl, qui se trouve ici: 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); 
     } 
    } 

J'ai également essayé de faire en sorte que rien ne se passe dans Flurl (Ceci est juste pour déboguer au point où je veux obtenir la réponse):

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(); 
    } 

Et le code se bloque au point d'attente et rien ne se passe. J'ai essayé de placer un point d'arrêt après le BulkEnrollRequest afin qu'il ne quitte jamais cette méthode.

Maintenant, voici la partie amusante: Cela a fonctionné pendant que je travaillais sur le ErrorHandler et à un moment donné l'API a cessé de répondre. Wireshark montre qu'une demande est faite ... alors je suis bloqué.

Toute aide est appréciée.

EDIT

Cela fonctionne maintenant! J'ai implémenté async depuis le contrôleur API jusqu'à RequestHandler, puis attendu pour chaque appel. Pour référence:

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

Télécharger Fiddler et comparer votre demande http avec une « Firefox affiche » envoie – Eser

+0

Merci pour les commentaires, je l'ai fait tout cela et je ne peux pas trouver quelque chose de bizarre à la demande. Je fais cependant avec Fiddler trouver que je reçois une réponse de l'API qui est précisément la "Réponse Réponse" que j'ai identifiée dans le code. J'ai aussi pris une trace de Wireshark et la circulation semble un peu étrange, je pense. Il n'y a aucune évidence RST ou FIN ACK me disant que la transaction est terminée ... – Miwca

Répondre

2

Ceci est maintenant corrigé. Je crois que la raison pour laquelle le trafic de Wireshark avait l'air si bizarre était à cause d'une impasse dans le code, et le timeout était de mon côté ce qui signifiait que je ne pourrais jamais FIN ACK l'information. Pour résoudre ce problème, j'ai implémenté async sur toutes les méthodes, du contrôleur à ma classe RequestHandler. Pour référence:

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

Heureux de te voir ne pas avoir abandonné Flurl;) –

0

Essayez ce code

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

Il bloque toujours à l'attente. C'est comme si mon code ne pouvait pas ramasser la réponse d'une façon ou d'une autre :) – Miwca