WP7和基本身份验证

时间:2011-01-24 23:21:09

标签: c# authentication windows-phone-7 webclient

我正在尝试使用WebClient(也尝试过HttpWebRequest)在需要基本身份验证的网站上调用受SSL保护的api,但是在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; 

但是同样的结果,任何关于我做错事的指示都会非常感激,因为我正在撕扯我对这一点的聆听。

BTW我已经尝试了上面的代码,调用不需要身份验证,并且工作正常,还尝试了WPF项目中的代码,并再次运行,它只是在WP7模拟器中失败。

提前致谢, 鲁珀特。

1 个答案:

答案 0 :(得分:1)

WebClient的回调被编组到UI线程上,因此您可能希望使用HttpWebRequest来避免阻止UI线程和反对影响应用程序的感知性能。也就是说,当我运行使用HttpWebRequest的代码版本时,我从服务器获得的响应如下:

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

这是因为Twitter已停止支持基本身份验证(无疑出于安全原因),现在只支持OAUTH。

Dan Booth有一个有用的blog post,它描述了如何在Twitter上使用OAUTH,并包含使用Hammock REST库的示例。您可能还想考虑使用诸如TweetSharp之类的Tiwtter库来节省您的时间和精力。