Silverlight WebClient не получает 400 плохой запрос
У меня есть WebClient, и я подписываюсь на обработчик событий OnDownloadStringCompleted. Когда сервер отвечает заголовком 400 неверных запросов, OnDownloadStringCompleted никогда не запускается. Мне все еще нужен ответ, хотя заголовок говорит 400. Есть ли способ обойти это?
Вот URL, который я пытаюсь получить: https://graph.facebook.com/me?access_token=your_token
1 ответ:
Во-первых, в моем тестировании я нахожу, что загружаемая строка completed действительно срабатывает.
Однако попытка прочитать свойство event args
Result
приведет к ошибке. Вам нужно проверить свойство event argsError
, чтобы определить, произошла ли ошибка. Если он обладает этим свойством, то будет содержать ссылку на AWebException
.К счастью, у
WebException
есть объектResponse
, который имеет типWebResponse
. Вы можете получить строку ответа из этого, используя небольшую функцию: -string StringFromWebResponse(WebResponse response) { using (StreamReader reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } }
Но есть проблема. Это доступно только при использовании стека ClientHTTP, а не стека BrowserHTTP. Поэтому вам нужно что-то вроде этой строки кода в вашем приложении: -
WebRequest.RegisterPrefix("https://graph.facebook.com", System.Net.Browser.WebRequestCreator.ClientHttp);
Тогда такой код будет работать: -
О, но, возможно, есть и другая проблема. Я ничего не знаю об API facebook, но если есть зависимость от cookies, то по умолчанию стек ClientHTTP не управляет самими cookies. Чтобы правильно обрабатывать файлы cookie, необходимо назначить каждому из них общуюWebClient client = new WebClient(); client.DownloadStringCompleted += (s, args) => { string result; if (args.Error == null) { result = args.Result; //Do something with the expected result } else { WebException err = args.Error as WebException; result = StringFromWebResponse(err.Response); // Do something with the error result } }; client.DownloadStringAsync(new Uri("https://graph.facebook.com/me?access_token=your_token", UriKind.Absolute));
CookieContainer
HttpWebRequest
используется.WebClient
не позволяет вам получить доступ к используемому объектуWebRequest
, поэтому вам придется перейти к использованиюWebRequest
/WebResponse
напрямую.