2011-11-25 2 views
4

Je vais avoir du mal à créer un équivalent WebRequest de la commande boucle suivante:WebRequest équivalent de `boucle -X SUPPRIMER ...`

curl -vX DELETE "http://admin:[email protected]:5984/booster" 

La commande fonctionne très bien, donne le résultat suivant:

C:\Projects\Booster\Bin>curl -vX DELETE "http://admin:[email protected]:5984/booster" 
* About to connect() to localhost port 5984 (#0) 
* Trying 127.0.0.1... connected 
* Server auth using Basic with user 'admin' 
> DELETE /booster HTTP/1.1 
> Authorization: Basic YWRtaW46MTIz 
> User-Agent: curl/7.22.0 (i386-pc-win32) libcurl/7.22.0 OpenSSL/0.9.8r zlib/1.2.5 
> Host: localhost:5984 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Server: CouchDB/1.0.2 (Erlang OTP/R14B) 
< Date: Fri, 25 Nov 2011 01:03:45 GMT 
< Content-Type: text/plain;charset=utf-8 
< Content-Length: 12 
< Cache-Control: must-revalidate 
< 
{"ok":true} 
* Connection #0 to host localhost left intact 
* Closing connection #0 

et supprime une base de données CouchDB comme prévu, mais quand j'utilise le code équivalent suivant:

try 
{ 
    var request = WebRequest.Create("http://admin:[email protected]:5984/booster"); 

    request.Headers.Clear(); 
    request.Method = "DELETE"; 

    var response = request.GetResponse(); 

    Console.WriteLine(response.GetResponseString()); 
} 
catch (WebException e) 
{ 
    Console.WriteLine(e.Response.GetResponseString()); 
} 

Pour faire la même chose que la commande curl, j'obtiens une exception indiquant

"Le serveur distant a renvoyé une erreur: (405) Méthode non autorisée."

Server répond avec '{ "erreur": "method_not_allowed", "raison": "Seul GET, HEAD a permis"}'

La question:

Quelle est la différence entre commande curl et la commande exécuté via WebRequest? Pourquoi dans le premier cas tout fonctionne et en second lieu tout échoue?

+1

Je ne connais pas la réponse à votre question, mais vous pouvez utiliser Wireshark ou peut-être Fiddler comme outil de diagnostic pour regarde ce qui se passe sur le fil. – Amy

+0

J'ai installé Wireshark Je ne comprends rien, pouvez-vous donner des liens vers des tuts de démarrage rapide? – Lu4

+1

Avez-vous essayé de définir la propriété [Credentials] (http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.credentials.aspx) au lieu de spécifier 'admin: 123' dans l'URL? – dtb

Répondre

3

J'ai réussi à comprendre quel était le problème, donc voilà:

Wireshark montré la communication suivante entre le client et le serveur:

WebRequest cas

DELETE /booster HTTP/1.1 
Host: localhost:5984 
Connection: Keep-Alive 

HTTP/1.1 302 Moved Temporarily 
Server: CouchDB/1.0.2 (Erlang OTP/R14B) 
Location: http://localhost:5984/_utils/session.html?return=%2Fbooster&reason=You%20are%20not%20a%20server%20admin. 
Date: Fri, 25 Nov 2011 09:54:29 GMT 
Content-Type: text/plain;charset=utf-8 
Content-Length: 64 
Cache-Control: must-revalidate 

{"error":"unauthorized","reason":"You are not a server admin."} 
DELETE /_utils/session.html?return=%2Fbooster&reason=You%20are%20not%20a%20server%20admin. HTTP/1.1 
Host: localhost:5984 

HTTP/1.1 405 Method Not Allowed 
Server: CouchDB/1.0.2 (Erlang OTP/R14B) 
Date: Fri, 25 Nov 2011 09:54:29 GMT 
Content-Type: text/plain;charset=utf-8 
Content-Length: 64 
Cache-Control: must-revalidate 
Allow: GET,HEAD 

{"error":"method_not_allowed","reason":"Only GET,HEAD allowed"} 

La boucle case

DELETE /booster HTTP/1.1 
Authorization: Basic YWRtaW46MTIz 
User-Agent: curl/7.22.0 (i386-pc-win32) libcurl/7.22.0 OpenSSL/0.9.8r zlib/1.2.5 
Host: localhost:5984 
Accept: */* 

HTTP/1.1 404 Object Not Found 
Server: CouchDB/1.0.2 (Erlang OTP/R14B) 
Date: Fri, 25 Nov 2011 09:54:14 GMT 
Content-Type: text/plain;charset=utf-8 
Content-Length: 41 
Cache-Control: must-revalidate 

{"error":"not_found","reason":"missing"} 

Cela montre que WebRequest n'utilise pas Basic au thorisation, et curl en utilise un. Un peu de googler montré la façon d'utiliser l'autorisation de base sur WebRequest et il se présente comme suit:

try 
{ 
    var request = WebRequest.Create("http://localhost:5984/booster"); 

    request.Headers.Clear(); 

    request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("admin:123")); 
    request.Method = "DELETE"; 

    var response = request.GetResponse(); 

    Console.WriteLine(response.GetResponseString()); 
} 
catch (WebException e) 
{ 
    Console.WriteLine(e.Response.GetResponseString()); 
} 
+1

Grats sur le comprendre! Je suppose que vous n'avez pas besoin de ces tutoriels Wireshark maintenant ...: P – Amy

+0

Youtube a fait le travail ... :) – Lu4

+1

Vous pouvez également utiliser: request.Credentials = new NetworkCredential ("admin", "123"); – Wil