1

Windows Phone 7/8 で Web サービスにアクセスするのは初めてです。WebClient を使用して、php Web サイトから文字列を取得しています。サイトは JSON 文字列を返しますが、現時点では、接続が機能するかどうかをテストするために、通常の文字列として TextBox に入れようとしています。

php-page には認証が必要ですが、それが私のコードが失敗していると思います。これが私のコードです:

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 TextBox に Google からの html テキストが入力されます (奇妙なことに、これは WebClient 資格情報がまだ設定されている場合でも機能します)。

クレデンシャルの設定に問題がありますか?認証情報を使用してphpページにアクセスする方法に関するガイドを検索しても、良い結果は見つかりませんでした。その後、どこかで 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.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System. System.Net.WebClient での Net.WebClient.GetWebResponse (WebRequest 要求、IAsyncResult 結果)。

更新 2:エラー ログの行は次のとおりです。

11 月 16 日 17:51:12 myservice httpd[21036]: 127.0.0.1 - - [16/11 月/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 を適切に処理できないことでした。

いくつかのGoogle検索の後、私はこの解決策を見つけました.それは完全に機能します: http://firebelly.net/post/3341374382/cookie-aware-webclient-for-wp7

したがって、基本的には、Cookie を保存できる WebClient クラスを拡張する独自のクライアント クラスを作成するだけです。

于 2013-01-25T20:11:16.863 に答える