2010-08-09 9 views
1

Je suis en train d'accéder à un webservice REST, mais mon code ne fonctionne pas et continue de lancer une erreur HTTP 401Accès REST WebService en VB.NET

voir cet exemple chapeau d'écran de Wireshark de la demande ssl initiale:

WireShark Screenshot

C'est d'un appel Curl à la même adresse Web avec les mêmes détails. Le problème est que sous ma version VB.NET la partie "Extension: nom_serveur" (et connexe) du paquet SSL est manquante, je crois que cela provoque le serveur à ne pas répondre avec l'échange de clé du serveur dans les paquets suivants.

est Ci-dessous le code VB.NET

Dim webRequest As HttpWebRequest = DirectCast(System.Net.WebRequest.Create(UrlString), HttpWebRequest) 
    webRequest.Method = "GET" 
    webRequest.ContentType = "application/x-www-form-urlencoded" 

    webRequest.Credentials = New NetworkCredential(username, password) 

    Dim response As HttpWebResponse = DirectCast(webRequest.GetResponse(), HttpWebResponse) 

Cela échoue sur la dernière ligne (HTTP 401 erreur), l'émission ne semble pas être lié à mon proxy et les informations d'identification utilisateur sont corrects pour le serveur comme cette requête fonctionne depuis Curl et wget.

J'ai déjà essayé de définir AuthenticationLevel et de définir manuellement l'en-tête Authorization, et PreAuthenticate ne semble pas non plus modifier ce problème.

Répondre

1

La réponse était que le WebService ne répondait pas avec un valide HTTP401 en-tête WWW-Authenticate, au lieu était juste retour avec le code comme:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Error> 
    <ErrorCode>NO_SUITABLE_AUTHENTICATION_METHOD</ErrorCode> 
    <ErrorDescription>No suitable active authentication mechanism found to authorise request - authorise using supported mechanisms</ErrorDescription> 
    <RequestID>gcqsrtvn</RequestID> 
    <SystemTime>2010-08-12T09:14:21.831+10:00</SystemTime> 
</Error> 

Je devais ajouter manuellement l'en-tête d'authentification comme indiqué ici: http://devproj20.blogspot.com/2008/02/assigning-basic-authorization-http.html

Code:

Dim authBytes() As Byte = System.Text.Encoding.UTF8.GetBytes(String.Format("{0}:{1}", username, password).ToCharArray()) 
webRequest.Headers("Authorization") = "Basic " + Convert.ToBase64String(authBytes) 
+0

Cela ne marche pas semble logique. Dans votre question, vous avez écrit que vous obtenez un 401 de retour, et que vous avez essayé d'ajouter l'en-tête d'autorisation vous-même et cela n'a pas fonctionné. Alors, pourquoi ça marche maintenant? En outre, si vous souhaitez simplement envoyer l'en-tête d'autorisation dans la première requête elle-même, vous pouvez simplement définir PreAuthenticate = true et définir les informations d'identification sur CredentialCache avec "Basic" comme méthode d'authentification. **** De toute façon, comme je l'ai dit, si vous obtenez une trace avec les instructions que j'ai données, je peux vous dire ce qui se passe. Il n'est pas légal pour un serveur de s'attendre à un en-tête d'autorisation, mais pas de défier le client. – feroze

+0

Le 401 que je récupère ne correspond pas à la norme et n'inclut aucune information d'en-tête auth. Quant à savoir pourquoi cela n'a pas fonctionné auparavant, c'était à cause d'un problème d'encodage et du code que j'utilisais pour l'en-tête manuel. De plus, le réglage de PreAuthenticate n'a pas fonctionné dans ce cas, le service auquel je me connecte est très négligé et aime les choses faites d'une manière très spécifique ... mais il n'y a pas de documentation sur comment. Légal ou pas n'importe pas, il ne le fait pas et ce qui était mon problème. – Seph