2017-03-17 2 views
1

Je rencontre des difficultés pour créer un POST à ​​l'aide du client http avec Accept, ContentType et Authentication en tant qu'en-têtes. J'ai essayé plusieurs implémentations en utilisant send aysnc et post async et tout semblait échouer. J'ai utilisé https://www.hurl.it/ pour m'assurer que si elle recevait aussi une erreur de temporisation mais qu'elle fonctionnait, elle récupérait les données json.Erreur de délai d'attente: HttpClient POST

Je reçois une exception d'erreur de délai de connexion (dans: var response = await client.SendAsync(request);) lors de l'exécution du code ci-dessous.

J'ai aussi une commande curl que j'essayais de faire, qui est également listée ci-dessous.

Mise en œuvre:

// Body 
      var dictionary = new Dictionary<string, string>(); 
      dictionary.Add("id", "123"); 

      var formData = new List<KeyValuePair<string, string>>(); 
      formData.Add(new KeyValuePair<string, string>("id", "123")); 

      // Http Client 
      var client = new HttpClient(); 
      client.BaseAddress = new Uri("https://www.some_website.com/api/house"); 

      // Http Request 
      var request = new HttpRequestMessage(HttpMethod.Post, "https://www.some_website.com/api/house"); 

      // Accept 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      // Content-Type 
      //request.Content = new FormUrlEncodedContent(dictionary); 

      var httpContent = new StringContent(
        JsonConvert.SerializeObject(
         dictionary, 
         new JsonSerializerSettings 
         { 
          NullValueHandling = NullValueHandling.Ignore 
         }), 
        Encoding.UTF8, 
        "application/json"); 

      request.Content = new StringContent(
        JsonConvert.SerializeObject(
         dictionary, 
         new JsonSerializerSettings 
         { 
          NullValueHandling = NullValueHandling.Ignore 
         }), 
        Encoding.UTF8, 
        "application/json"); 

      // Authentication 
      var byteArray = new UTF8Encoding().GetBytes("user" + ":" + "pass"); 
      //client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 

      var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 
      client.DefaultRequestHeaders.Authorization = header; 

      // Communication 
      try 
      { 
       var response = await client.SendAsync(request);//PostAsync("https://www.some_website.com/api/house", httpContent); 
       if (response.IsSuccessStatusCode) 
       { 
        var myContent = await response.Content.ReadAsStringAsync(); 
        var deliveryStatus = JsonConvert.DeserializeObject<MyOjbect>(myContent); 
       } 
      } 
      catch (Exception e) 
      { 
       //catch error 
      } 

Curl:.

curl -i --user user:123 -H Accept:application/json -H content-type:application/json -H cache-control:no-cache -X POST https://www.some_website.com/api/house -H Content-Type: application/json -d '{"id": "123"}' 
+1

Vous définissez votre propriété BaseAddress et la propriété Uri HttpRequestMessage à la fois url absolue, ne devrait-elle pas être l'adresse de base (ex. https://somewebsite.com) et l'url relative (ex. (api/house)? Vous pouvez également inspecter votre demande avec Fiddler http://www.telerik.com/fiddler –

+1

Je pense que vous avez raison. changements et toujours eu une erreur de connexion erreur – PLOW

+1

Le problème a été résolu! Le code est correct Le problème était que j'utilisais le campus de l'école wifi donc j'étais derrière un proxy.Renvoyer à la maison et en utilisant mon wifi ne me donne pas de temps – PLOW

Répondre

2

Vous définissez votre BaseAddress et la HttpRequestMessage propriété Uri deux à la même URL absolue, il ne devrait pas être l'adresse de base (ex somewebsite .com) et l'url relative (ex. (api/house) .Vous pouvez également inspecter votre requête avec Fiddler telerik.com/fiddler