2

サーバーからデータを読み込もうとしています (xml データ)。utomaticDecompression を DecompressionMethods.GZip | に設定できるので、通常は HttpWebRequest を使用します。DecompressionMethods.Deflate を使用して、データの gzip 圧縮を自動的に使用します。

最近、あるクライアントから、自分の学校からは機能しないというメールが届きました。TestFlightApp 経由でアプリの別のコピーを彼に送信して、彼からより多くのデバッグ情報を取得すると、アプリは 407 認証エラーで応答します。それ以来、私は自分のコンピューターにプロキシを設定し、iPhone トラフィックをリダイレクトしてテストしました。

私の元の設定はそうでした、

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url);
request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.Proxy = null;
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
WebResponse response = request.GetResponse();

などなど。

ほとんどの場合、ユーザーはプロキシの背後にいないため、Proxy を null に設定します。これにより、プロキシの解決に 1 ~ 2 秒の時間がかかります。後でこれをキャッチして HttpWebRequest を再作成するコードがありますが、デフォルトのプロキシであると思われるプロキシを無効にしないでください。どうやらそうではない...

次に、デバイスのデフォルトのプロキシ設定を取得しようとしました。

CFProxySettings proxy0 = CFNetwork.GetSystemProxySettings();
IWebProxy proxy1 = WebRequest.GetSystemWebProxy();
IWebProxy proxy2 = HttpWebRequest.DefaultWebProxy;
IWebProxy proxy3 = HttpWebRequest.GetSystemWebProxy();
IWebProxy proxy4 = CFNetwork.GetDefaultProxy();

proxy1 - proxy4 の資格情報は null です。proxy0 には、プロキシ URL、ポート、ユーザー名など、必要なプロキシ情報が含まれていますが、パスワードは含まれていません...

資格情報を使用して WebProxy を手動で作成しました

WebProxy webProxy = new WebProxy(proxy0.HTTPProxy, proxy0.HTTPPort);
webProxy.Credentials = new NetworkCredential("user", "pass");
request.Proxy = webProxy;

これは機能します。407 エラーでプロキシのユーザー名とパスワードを要求できません。どうすればよいかわかりません... WebClient のダウンロードは機能しませんが、UIWebView と MKMapView はそれ自体を自動認証します。

私が見逃しているアイデアはありますか?

編集:

これを見つけました、https://bugzilla.xamarin.com/show_bug.cgi?id=1081

4

1 に答える 1

3

今日、私はこれを見て、多くのデバッグを行い、Apple のドキュメントを閲覧しました。残念ながら、肯定的な答えを「不可能」と見なさない限り、肯定的な答えはありません...

一般的な問題

Apple のドキュメントによるとCFProxySupport、保存されているプロキシ資格情報へのアクセスは許可されません。

文書化されていないプロキシ ユーザー名を取得する方法があります (返された辞書は文字列をキーとして使用します。これらのキーの 1 つは "HTTPUser" または "HTTPProxyUsername" と呼ばれますが、その文字列定数は見つかりませんでした)。パスワード。

Mac OS X の場合

実際、Mac OS X には解決策があります。単純なNSURLConnectionベースの例を実行したところ、キーチェーンへのアクセス許可を求められたので、キーチェーン ユーティリティを開いて、ログイン キーチェーンでプロキシ資格情報を見つけました。また、それを取得するための簡単な Objective C 関数も作成しましたが、プロキシ ユーザー名を知る必要があります (ただし、 を使用したことはありませんが、うまくいく可能性がありNULLます)。

また、そのユーザー名が NULL かどうかを確認する以外に、認証が必要かどうかを確認する方法も見つかりませんでした。残念ながら、アイテムが存在するかどうかを確認するにはキーチェーン アクセス権限が必要なので、実際に認証が必要であることを確認する必要があります。これを行う 1 つの方法は、既に HTTP 407 を受信した後に内部から行うことですHttpWebConnection(これらには目的のユーザー名も含まれています)。

iOS の場合

これまでインターネットで読んだことによると、iOS ではシステム キーチェーンにアクセスできません。それが存在するかどうかさえわかりません。またCFProxySupport、資格情報は返されません。

また、iOS API を使用せずに HTTP アクセスを行う場合を除き、プロキシ パスワードを知る必要はありません。したがって、それを取得する方法がないというかなりの可能性があります。

解決策として、NSURLConnectionまたはCFNetworkハンドラなどの iOS API を使用できます。WebClient

于 2012-12-04T00:05:13.393 に答える