Domanda

Sto cercando di accedere alle API Last.fm tramite C#. Come primo test sto interrogando artisti simili se questo è importante.

Ricevo una risposta XML quando passo un nome artista corretto, cioè "Nirvana". Il mio problema è quando consegno un nome non valido (cioè "nirvana23") non ricevo XML ma un codice di errore (403 o 400) e a WebException.

Cosa interessante: se inserisco l'URL all'interno di un browser (testato con Firefox e Chrome) ricevo il file XML che desidero (contenente un messaggio di errore specifico LastFM).

Ho provato entrambi XmlReader e XDocument:

XDocument doc = XDocument.Load(requestUrl);

e 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 è qualcosa di simile "http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=nirvana23"(E una chiave specifica fornita da LastFM, ma anche senza di essa - dovrebbe restituire XML). Un link per provarlo: collegamento (Questo è il file di errore a cui non posso accedere tramite C#).

Quello che ho anche provato (senza successo): confrontare la richiesta sia da parte del browser che del mio programma con l'aiuto di Wireshark. Poi ho aggiunto alcune intestazioni alla richiesta, ma non ha aiutato neanche.

È stato utile?

Soluzione

In .NET la WebRequest sta convertendo i codici di errore HTTP in eccezioni, mentre il browser li sta semplicemente ignorando poiché la risposta non è vuota. Se catturi l'eccezione, il metodo getResponseStream dovrebbe comunque restituire l'errore XML che ti aspetti.

Modificare:

Prova questo:

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();

Altri suggerimenti

Perché non catturi l'eccezione e poi elaboralo di conseguenza. Se si desidera visualizzare qualsiasi errore personalizzato, puoi farlo anche nel tuo blocco di cattura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top