在我的WinPhone应用程序中,我正在访问REST服务。 一开始我使用的是这段代码:
WebClient wc = new WebClient();
wc.Credentials = credentials;
wc.Headers["App-Key"] = appKey;
wc.DownloadStringCompleted +=
(o, args) => MessageBox.Show(args.Error == null ? "OK" : "Error");
wc.DownloadStringAsync(uri);
但它突然停止工作返回我“远程服务器返回错误:NotFound”错误。在谷歌会话和控制面板中的一些点击后,我没有让它工作。 我决定尝试另一种方式:
HttpWebRequest request = HttpWebRequest.CreateHttp(uri);
request.Credentials = credentials;
request.Headers["App-Key"] = appKey;
request.BeginGetResponse(asResult =>
{
var response = request.EndGetResponse(asResult) as HttpWebResponse;
StreamReader reader = new StreamReader(response.GetResponseStream());
string responseString = reader.ReadToEnd();
Dispatcher.BeginInvoke(
() => MessageBox.Show(response.StatusCode.ToString()));
}, null);
它有效。
我还尝试运行第一个剪切指向URI到谷歌的主页并且它可以工作(当然我必须删除凭据)。
有人可以解释发生了什么吗?
更新
我设法通过替换
来实现它wc.Credentials = new NetworkCredentials(username, password);
与
wc.Headers["Authorization"] = "Basic someBase64encodedString";
但我仍然想知道发生了什么,第一行和第二行之间存在差异。
PS:测试URI为:https://api.pingdom.com/api/2.0/checks,但您需要一个app键。
答案 0 :(得分:0)
使用Credentials属性时,HttpWebRequest实现将等待来自服务器的质询响应,然后发送'Authorization'标头值。
但在某些情况下这可能是一个问题,因此您必须通过直接提供授权标头来强制进行基本身份验证。
使用像Spring.Rest这样的REST客户端库时的示例:
RestTemplate template = new RestTemplate("http://example.com");
template.RequestInterceptors.Add(new BasicSigningRequestInterceptor("login", "password"));
string result = template.GetForObject<string>(uri);