Silverlight WebClient не получает 400 плохой запрос


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

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

1 2

1 ответ:

Во-первых, в моем тестировании я нахожу, что загружаемая строка completed действительно срабатывает.

Однако попытка прочитать свойство event args Result приведет к ошибке. Вам нужно проверить свойство event args Error, чтобы определить, произошла ли ошибка. Если он обладает этим свойством, то будет содержать ссылку на A 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, но если есть зависимость от cookies, то по умолчанию стек ClientHTTP не управляет самими cookies. Чтобы правильно обрабатывать файлы cookie, необходимо назначить каждому из них общую CookieContainer HttpWebRequest используется. WebClient не позволяет вам получить доступ к используемому объекту WebRequest, поэтому вам придется перейти к использованию WebRequest/WebResponse напрямую.