2017-10-04 6 views
1

J'ai une commande cURL fournie par WooCommerce:plissement application .NET

curl https://example.com/wp-json/wc/v2/orders \ 
-u consumer_key:consumer_secret 

J'utilise WebClient:

using (WebClient wc = new WebClient()) 
{ 
    Uri url = new Uri("https://www.myhost.com/wp-json/wc/v2/orders"); 
    System.Collections.Specialized.NameValueCollection reqparm = new System.Collections.Specialized.NameValueCollection(); 
    reqparm.Add("consumer_key", keyValue); 

    byte[] responsebytes = wc.UploadValues(url, "POST", reqparm); 
    string responsebody = Encoding.UTF8.GetString(responsebytes); 
} 

Mais je reçois cette erreur:

IOException: impossible de lire les données à partir de la connexion de transport: une connexion existante a été fermée de force par l'hôte distant.

Qu'ai-je fait de mal ici? Je suis sûr que mon URL et ma clé sont corrects.

EDIT: Avez-juste essayé cela comme suggéré par CmdrTchort et David:

using (WebClient wc = new WebClient()) 
{ 
    wc.UseDefaultCredentials = true; 
    wc.Credentials = new NetworkCredential("consumer_key", keyValue);     
    string responsebody = wc.DownloadString("https://www.myhost.com/wp-json/wc/v2/orders"); 
} 

recevant toujours la même erreur.

EDIT: Je soupçonne que j'ai fourni des informations d'identification non valides je mettrai à jour une fois que cela devient clair ...

m'a donné les informations d'identification erronées. Cependant, cela n'a pas résolu le problème. Je ne comprends pas comment consumer_key:consumer_secret est censé être représenté dans cette requête. Il y a deux valeurs: consumer_key et consumer_secret (je n'ai été fourni avec consumer_secret auparavant, que j'ai placé où keyValue est). Je suppose maintenant qu'il est censé être de la forme:

wc.Credentials = new NetworkCredential("consumer_key", "consumer_secret"); 

où « consumer_key » et « consumer_secret » représentent les valeurs uniques fournies. Cela ne fonctionne pas. Cela commence à devenir légèrement irritant.

+0

En raison du message d'erreur, il ressemble à la manipulation du certificat ou un problème de version SSL/TLS ou non-concordance – Pac0

+2

vous mentionné que vous avez la commande cURL fournie par eux, mais avez-vous testé à partir du poste de travail où vous essayez de frapper via WebClient? Cela pourrait aider à mieux isoler le problème pour savoir si le même problème se produit avec cURL et vous guider si vous devriez regarder votre propre code ou quelque chose entre vous et le service Web. –

Répondre

0

Vous publiez le consumer_key:consumer_secret dans le cadre d'un formulaire POST, mais ce n'est pas ce que cURL faisait. Cela ressemble plus à une requête GET avec l'authentification fournie. Peut-être quelque chose comme ceci:

wc.Credentials = new NetworkCredential("consumer_key", "consumer_secret"); 

puis de faire une demande GET au lieu d'un POST. Avec aucune valeur à télécharger, cette partie peut être simplifiée. Peut-être quelque chose comme:

string responsebody = wc.DownloadString(url); 
+0

Merci, mais toujours recevoir la même erreur (voir le message édité) – Dom

+0

@Dom: Avez-vous confirmé que la commande cURL lui-même a réussi? Si rien ne fonctionne, vous devrez peut-être vérifier auprès du fournisseur. – David

0

-u dans curl passe les informations d'identification comme en-têtes autorisés et non comme un dictionnaire de paramètres.

Vous pouvez ajouter vos informations d'identification avec:

wc.UseDefaultCredentials = true; 
wc.Credentials = new NetworkCredential("username", "password"); 

Votre service est-répond et/ou est-il un certificat non approuvé ou auto-signé? Si tel est le cas, vous pouvez tester en ignorant l'avertissement SSL. Btw, curl utilise get par défaut (-X spécifie la méthode, ce que je ne peux pas voir dans votre exemple) - donc je suppose que vous ne recevez que par défaut et ne publiez pas de valeurs? Si oui, vous pouvez utiliser DownloadString() directement.

Donc, si vous essayez d'obtenir un fichier à partir de cette URL, vous pouvez faire:

// IGNORE ALL SSL Certificates - would not do this in production 
ServicePointManager.ServerCertificateValidationCallback = 
     new RemoteCertificateValidationCallback(
      delegate 
      { return true; } 
     ); 

using (WebClient wc = new WebClient()) 
{ 
wc.UseDefaultCredentials = true; 
wc.Credentials = new NetworkCredential("consumer_key", keyValue); 
string responsebody = wc.DownloadString("https://www.myhost.com/wp-json/wc/v2/orders"); 
} 
+0

Avoir essayé votre exemple (était une demande GET, mon erreur) mais toujours obtenir la même erreur. – Dom

+0

Des problèmes avec votre certificat SSL? Testez la méthode ci-dessus dans quel cas. Si ce n'est pas le cas, vous devez vérifier si votre service/vos commandes fonctionnent toujours lorsque vous le demandez à partir d'un navigateur ou similaire. – CmdrTchort