WP7 и базовая аутентификация - PullRequest
0 голосов
/ 25 января 2011

Я пытаюсь использовать w WebClient (также пробовал HttpWebRequest) для вызова API, защищенного с помощью SSL, на веб-сайте, требующем базовой аутентификации, но получаю исключение в обратном вызове DownloadStringAsync.Вот мой код, в данном случае вызывающий Twitter:

    private void Button_Click2(object sender, RoutedEventArgs e)
    {
        WebClient webClient = new WebClient();

        webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
        NetworkCredential credentials = new NetworkCredential("username", "password");
        webClient.Credentials = credentials;
        webClient.DownloadStringAsync(new Uri(@"http://twitter.com/statuses/friends_timeline.xml"));
    }

    void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    {
        System.Diagnostics.Debug.WriteLine("e.Error: " + e.Error);    
    }

Как я уже говорил, я получаю исключение с текстом ниже

{"Удаленный сервер возвратил ошибку: NotFound."}

Из прочтения различных сообщений может показаться, что WebClient не отправляет учетные данные. Я также попробовал следующее:

        string authInfo = "username:password";
        authInfo = Convert.ToBase64String(StringToAscii(authInfo));

        webClient.Headers["Authorization"] = "Basic " + authInfo; 

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

Кстати, я пробовал приведенный выше код с вызовом, который не требует аутентификации и работает нормально, также пробовалкод в проекте WPF и снова он работает, это только в эмуляторе WP7, что он терпит неудачу.

Заранее спасибо, Руперт.

1 Ответ

1 голос
/ 25 января 2011

Обратные вызовы для WebClient направляются в поток пользовательского интерфейса, поэтому вы можете вместо этого использовать HttpWebRequest, чтобы избежать блокировки потока пользовательского интерфейса и воздействия, влияющего на воспринимаемую производительность вашего приложения. Тем не менее, когда я запускаю версию вашего кода, которая использует HttpWebRequest ответ, который я получаю от сервера, выглядит следующим образом:

<code><errors>
  <error code="53">Basic authentication is not supported</error> 
</errors>

Это потому, что Twitter перестал поддерживать базовую аутентификацию (без сомнения, по соображениям безопасности) и теперь поддерживает только OAUTH.

Дэн Бут имеет полезное сообщение в блоге , в котором описывается, как использовать OAUTH с Twitter, и приведены примеры использования библиотеки REST Hammock . Вы также можете использовать библиотеку Tiwtter, например TweetSharp , чтобы сэкономить время и усилия.

...