WebClient NotFound错误但使用HttpWebRequest / Response

时间:2011-05-26 22:36:03

标签: windows-phone-7

在我的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键。

1 个答案:

答案 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);