XML-файл ответов: получен в браузере, а не через C # - PullRequest
1 голос
/ 23 января 2012

Я пытаюсь получить доступ к API last.fm через C #.В качестве первого теста я опрашиваю похожих художников, если это имеет значение.

Я получаю XML-ответ, когда передаю правильное имя исполнителя, то есть «Нирвану».Моя проблема заключается в том, что, когда я предоставляю недопустимое имя (например, «Nirvana23»), я не получаю XML, а код ошибки (403 или 400) и WebException.

Интересная вещь: если я ввожу URL-адрес в браузере (протестировано с Firefox и Chrome), я получаю нужный XML-файл (содержащий сообщение об ошибке lastfm).

Я пробовал оба XmlReader и XDocument:

XDocument doc = XDocument.Load(requestUrl);

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

URL-адрес похож на "http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=Nirvana23" (и конкретный ключ, полученный lastfm, но даже без него - он должен возвращать XML). Ссылка, чтобы попробовать: ссылка (это файл ошибок, к которому я не могу получить доступ через C #).

То, что я тоже пробовал(без успеха): сравнение запроса браузером и моей программой с помощью WireShark. Затем я добавил несколько заголовков в запрос, но это тоже не помогло.

Ответы [ 2 ]

1 голос
/ 23 января 2012

В .NET WebRequest преобразует коды ошибок HTTP в исключения, а ваш браузер просто игнорирует их, так как ответ не пустой. Если вы перехватываете исключение, метод GetResponseStream все равно должен вернуть ожидаемый вами XML-код ошибки.

Edit:

Попробуйте это:

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();
1 голос
/ 23 января 2012

Почему бы вам не перехватить исключение и не обработать его соответствующим образом.Если вы хотите отобразить любую пользовательскую ошибку, вы можете сделать это также в своем блоке catch.

...