1

我是使用 Windows Phone 7/8 访问 Web 服务的新手。我正在使用 WebClient 从 php 网站获取字符串。该站点返回一个 JSON 字符串,但目前我只是想将它作为普通字符串放入 TextBox 中,以测试连接是否有效。

php 页面需要身份验证,我认为这就是我的代码失败的地方。这是我的代码:

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("myUsername", "myPassword");
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.DownloadStringAsync(new Uri("https://www.mywebsite.com/ba/php/jsonstuff.php"));

void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    try
    {
        string data = e.Result;
        this.jsonText.Text = data;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}

这首先返回一个 WebException,然后返回一个 TargetInvocationException。如果我将 Uri 替换为例如“http://www.google.com/index.html”,则 jsonText 文本框将填充来自 Google 的 html 文本(奇怪的是,即使仍然设置了 WebClient 凭据,这也可以工作)。

那么是凭证设置的问题吗?在搜索有关如何使用凭据访问 php-pages 的指南时,我找不到任何好的结果,只有没有它们。然后我在某处找到了一个简短的提及来使用 WebClient.Credentials 属性。但它应该以其他方式工作吗?

更新:这是我可以从 WebException 中得到的(抱歉格式错误):

System.Net.WebException:远程服务器返回错误:NotFound。--->System.Net.WebException:远程服务器返回错误:NotFound。在 System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 在 System.Net.Browser.ClientHttpWebRequest.<>c_ DisplayClasse.b _d(Object sendState) 在 System.Net.Browser.AsyncHelper.<>c_ DisplayClass1.b _0 (Object sendState) --- 内部异常堆栈跟踪结束 --- 在 System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) 在 System. System.Net.WebClient 处的 Net.WebClient.GetWebResponse(WebRequest 请求,IAsyncResult 结果)。

更新 2:这是错误日志行:

11 月 16 日 17:51:12 myservice httpd[21036]: 127.0.0.1 - - [16/Nov/2012:17:51:12 +0200] "GET /ba/php/jsonstuff.php?origpath=/ba/php /jsonstuff.php HTTP/1.1" 401 290 "-" "Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;WOW64;Trident/6.0)"

401 我猜会建议虚假凭据?

4

2 回答 2

0

在我看来,您确实需要了解服务器如何处理您的请求。WebException 中的“NotFound”可能意味着您指的是不存在的位置。但我确信您传递了正确的 URL。所以服务器上一定有一些逻辑可以重定向你。如果您使用桌面浏览器访问该 URL - 您是否有任何类型的 SSL 证书错误或警告?也许这就是原因。尝试使用 IE 在手机上导航。或者您可以设置另一个主机来试一试。

我将在我的机器上设置一个主机并尝试一下。

我猜是SSL证书的问题。WP 在检查 SSL 证书时非常严格,因此您应该尝试不使用 ssl 或在您的模拟器/手机上安装证书或在您的服务器上安装有效(非自生成)证书。

于 2012-11-17T23:11:23.817 回答
0

好的,所以我找到了一种方法来让它工作。问题是 WebClient 类无法正确处理 Web 服务的 cookie。

经过一些谷歌搜索后,我找到了这个解决方案,它运行良好: http: //firebelly.net/post/3341374382/cookie-aware-webclient-for-wp7

所以基本上你只需创建自己的客户端类,扩展可以存储 cookie 的 WebClient 类。

于 2013-01-25T20:11:16.863 回答