2011-05-26 1 views
1

Dans mon application WinPhone, j'accède à un service REST. Au début j'utilisais ce code:Erreur WebFormulaire NotFound mais utilisation de HttpWebRequest/Réponse

WebClient wc = new WebClient(); 
wc.Credentials = credentials; 
wc.Headers["App-Key"] = appKey; 
wc.DownloadStringCompleted += 
    (o, args) => MessageBox.Show(args.Error == null ? "OK" : "Error"); 
wc.DownloadStringAsync(uri); 

, mais il a soudainement cessé de fonctionner me retourner un « Le serveur distant a renvoyé une erreur: NotFound » erreur. Après une session google et quelques clics dans le panneau de configuration, je n'ai pas réussi à le faire fonctionner. Je décidé d'essayer cette autre façon:

HttpWebRequest request = HttpWebRequest.CreateHttp(uri); 
request.Credentials = credentials; 
request.Headers["App-Key"] = appKey; 
request.BeginGetResponse(asResult => 
    { 
     var response = request.EndGetResponse(asResult) as HttpWebResponse; 
     StreamReader reader = new StreamReader(response.GetResponseStream()); 
     string responseString = reader.ReadToEnd(); 

     Dispatcher.BeginInvoke(
      () => MessageBox.Show(response.StatusCode.ToString())); 
    }, null); 

et il fonctionne.

J'ai aussi essayé de courir le premier Snipped pointant l'URI vers la page d'accueil de Google et il fonctionne (je devais supprimer les informations d'identification, bien sûr).

Quelqu'un peut-il expliquer ce qui se passe?

MISE À JOUR

j'ai réussi à le faire fonctionner en remplaçant le

wc.Credentials = new NetworkCredentials(username, password); 

avec

wc.Headers["Authorization"] = "Basic someBase64encodedString"; 

mais je me demande encore ce qui est arrivé et quelles sont les différences entre la première et la deuxième ligne.

PS: l'URI test est: https://api.pingdom.com/api/2.0/checks mais vous aurez besoin d'une application clé d'eux.

Répondre

0

Lorsque vous utilisez la propriété de vérification des pouvoirs, la mise en œuvre HttpWebRequest attendra la réponse de défi du serveur avant d'envoyer la valeur d'en-tête « Autorisation ».

Mais cela peut être un problème dans certains cas, vous devez forcer l'authentification de base en fournissant directement l'en-tête d'autorisation.

Exemple lors de l'utilisation d'une bibliothèque REST client comme Spring.Rest:

RestTemplate template = new RestTemplate("http://example.com"); 
template.RequestInterceptors.Add(new BasicSigningRequestInterceptor("login", "password")); 
string result = template.GetForObject<string>(uri); 
Questions connexes