0

最初のMonoTouchiOSアプリケーションを開発するとき、System.Uriインスタンスを使用してプライベートWebサービスから保護されたリソースをダウンロードしようとしましたが、すべてのインスタンスが常にエスケープされていないURLを返すため、署名をチェックするとリクエストが失敗します。

良いリクエストの例:

http://example.com/folder%2Ftest?signature=000%3D

悪いリクエストの例:

http://example.com/folder/test?signature=000=

リソースを適切にダウンロードするには、適切なURLを単純な文字列から適切なUriインスタンスに変換する必要があります。プロセスを開始したばかりですが、結論を出すことができません。

string urlStringVersion = "http://example.com/folder%2Ftest?signature=000%3D";
//
// urlStringVersion == http://example.com/folder%2Ftest?signature=000%3D

Uri urlUriVersion = new Uri (urlStringVersion);
//
// urlUriVersion == http://example.com/folder/test?signature=000=

var fi = typeof (Uri).GetField ("host", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue (urlUriVersion, "example.com");
//
// urlUriVersion.AbsoluteUri is now == http://example.com/folder/test?signature=000%3D

<Another C# command here>

//
// urlUriVersion.AbsoluteUri is now == http://example.com/folder%2Ftest?signature=000%3D

最後に、最後のurlUriVersion.AbsoluteUriが同じ最初のurlStringVersionで記述されたURLを指すようにするために、ここで別のC#コマンドを置き換えるためにどのコマンドを使用できますか?

この変換を機能させる必要があります。そうしないと、プライベートWebサービスでリソースを公開する必要があります。

また、いくつかの代替案をテストしました。

  1. 次のような他の質問から:URLエンコードされたスラッシュを使用してURLを取得しますが、いくつかの例外が発生しています:

    System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません

  2. 構成ファイルを使用しますが、この場合、モバイルデバイスには技術的にアプリケーションドメインがないため、使用できません。

  3. パーセント記号をエンコードされたパーセント記号に置き換えてURLを二重エンコードします(したがって、「%」は「%25」になります)。

私の試みのどれも私の問題を解決しませんでした。

前もって感謝します、

ピバ

4

1 に答える 1

1

使用しているUriコンストラクターは、エスケープされたURL文字列ではなく、エスケープされていないURL文字列を取ります。

Uriインスタンスを作成する前に、URL文字列のエスケープを解除してみてください。

string urlStringVersion = "http://example.com/folder%2Ftest?signature=000%3D";
urlStringVersion = Uri.UnescapeDataString (urlStringVersion);

Uri urlUriVersion = new Uri (urlStringVersion);

URIを(エスケープされていない)文字列に変換する場合は、GetComponentsメソッドを使用します。

var unescaped = urlUriVersion.GetComponents (UriComponents.HttpRequestUri, UriFormat.Unescaped);
var escaped = urlUriVersion.GetComponents (UriComponents.HttpRequestUri, UriFormat.UriEscaped);

プライベートフィールドの値を変更しないでください。これは、いつかアプリを壊してしまうことになります。あなたはUriクラスのすべてのテストを回避しています(クラスを設計もテストもされていない方法で使用しています)。さらに、実装はいつでも変更される可能性があります。

于 2012-11-16T12:33:35.090 に答える