Silverlight WebClient НЕ получает 400 неверных запросов - PullRequest
2 голосов
/ 26 августа 2011

У меня есть WebClient, и я подписываюсь на обработчик событий OnDownloadStringCompleted.Когда сервер отвечает заголовком 400 Bad Request, OnDownloadStringCompleted Никогда не срабатывает.Мне все еще нужен ответ, хотя в заголовке написано 400. Есть ли способ обойти это?

Вот URL, который я пытаюсь получить: https://graph.facebook.com/me?access_token=your_token

1 Ответ

1 голос
/ 26 августа 2011

Прежде всего в моем тестировании я обнаружил, что DownloadStringCompleted запускается.

Однако попытка прочитать свойство args Result при событии вызовет ошибку.Вам необходимо проверить свойство args Error события, чтобы определить, произошла ли ошибка.Если оно имеет это свойство, оно будет содержать ссылку на WebException.

К счастью, 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);

Итак, код, подобный этому, будет работать: -

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

О, но, возможно, есть другая проблема.Я ничего не знаю об API Facebook, но если есть зависимость от куки, то по умолчанию стек ClientHTTP не управляет куки сам.Для правильной обработки файлов cookie необходимо назначить общий CookieContainer каждому используемому HttpWebRequest.WebClient не позволяет получить доступ к используемому объекту WebRequest, поэтому вам нужно перейти к использованию WebRequest / WebResponse напрямую.

...