File di risposta XML: ricevuto nel browser, non tramite C#
-
12-11-2019 - |
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.
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.