我是使用 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 我猜会建议虚假凭据?