我正在尝试使用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模拟器中失败。
提前致谢, 鲁珀特。
答案 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库来节省您的时间和精力。