Question

J'essaie d'accéder aux API last.fm via C#.Comme premier test, j'interroge des artistes similaires si cela compte.

Je reçois une réponse XML lorsque je transmets un nom d'artiste correct, c'est-à-dire"Nirvana".Mon problème est lorsque je fournis un nom invalide (c'est-à-dire"Nirvana23") Je ne reçois pas de XML mais un code d'erreur (403 ou 400) et un WebException.

Chose intéressante:Si je saisis l'URL dans un navigateur (testé avec Firefox et Chrome), je reçois le fichier XML souhaité (contenant un message d'erreur spécifique à lastfm).

J'ai essayé les deux XmlReader et XDocument:

XDocument doc = XDocument.Load(requestUrl);

et HttpWebRequest:

string httpResponse = "";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);

HttpWebResponse response = null;
StreamReader reader = null;

try
{
     response = (HttpWebResponse)request.GetResponse();
     reader = new StreamReader(response.GetResponseStream());
     httpResponse = reader.ReadToEnd();
}    

L'URL ressemble à "http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=Nirvana23" (et une clé spécifique donnée par lastfm, mais même sans elle, elle devrait renvoyer du XML).Un lien pour essayer : lien (c'est le fichier d'erreur auquel je ne peux pas accéder via C#).

Ce que j'ai aussi essayé (sans succès) :comparer la demande du navigateur et de mon programme avec l'aide de WireShark.Ensuite, j'ai ajouté quelques en-têtes à la demande, mais cela n'a pas aidé non plus.

Était-ce utile?

La solution

Dans .NET, WebRequest convertit les codes d'erreur HTTP en exceptions, alors que votre navigateur les ignore simplement puisque la réponse n'est pas vide.Si vous détectez l'exception, la méthode GetResponseStream doit toujours renvoyer l'erreur XML que vous attendez.

Modifier:

Essaye ça:

string httpResponse = "";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);

WebResponse response = null;
StreamReader reader = null;
try
{
    response = request.GetResponse();
}
catch (WebException ex)
{
    response = ex.Response;
}

reader = new StreamReader(response.GetResponseStream());
httpResponse = reader.ReadToEnd();

Autres conseils

Pourquoi ne captez-vous pas l'exception et ne la traitez-vous pas en conséquence.Si vous souhaitez afficher une erreur personnalisée, vous pouvez également le faire dans votre bloc catch.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top