2012-01-13 10 views
3

私は非適合のUrisの使用について尋ねるいくつかの投稿を見ましたが、どれも良い答えはありません。私はWindows Phoneコントロールを作成しており、HTTP GETを使用してATOMデータを要求する必要があります。 URLには、%3d(等号)という文字を含める必要があります。これは、私が支配していない第三者サービスであるため、交渉はできません。私はDownloadStringAsyncでWebクライアントを使用していリテラルUriのリクエスト

http://host.com?arg1=val1&arg=val2%3d

が、それは文字列でウリオブジェクトではなく、URLのみを受け付け、次のようなURLを想像してみてください。 URIオブジェクトは、自動的にこれらの文字をエスケープしと送信します。

http://host.com?arg1=val1&arg=val2=

これが失敗しました。推奨されないコンストラクタ引数 "UserExcaped"がありますが、これは必要なものですが、利用できません。私の唯一の選択肢は、rawソケットと最小限のHTTPサポートを使用して独自の文字列ダウンロードメソッドを実装することです。

他の考えはありますか?ヘルプは非常に感謝!

UPDATE

 string apps = "http://blah.com/api?prev=AAAAAAA%3d&next=BBBBBBB"; var u = new Uri(apps); string apps2 = u.ToString(); Debug.Assert(apps == apps2); // That %3d will always be converted to an equals sign

はまた、私は、そのIが25%パーセントを符号化することによって巧妙なことしようとした場合(それがだ "PREV = AAAAAA%253D &次= BBBBB")、指摘すべきです%25のそのままのリテラル文字列をそのまま受け取りましょう!等号に変換することは積極的です。

+0

あなたはページページResponseEncoding =「ISO-8859-1」が、それはエンコードの問題 – MethodMan

+0

のように聞こえる設定することができます方法は、あなたがHttpUtility.UrlEncodeまたはHttpUtility.UrlDecode、などを使用してみましたがありますか..?私は間違いなくエンコードされたparamatersでサーバーに当たったが、代わりにHttpWebRequestを使用していた。 –

+0

Hmmm ...私は私の質問に例を追加しました。 URIを構築しようとするとすぐに、URIが壊れてしまいます。 –

答えて

1

Uriクラスは、そのように設計されています。 MSDN

いくつかの方式のコンストラクタにおける正規化の一部として、 は表現が圧縮されているエスケープ。 コンパクトなエスケープシーケンスのURIスキームは、ファイル、、http、https、 、net.pipe、およびnet.tcpを含みます。他のすべてのスキームでは、エスケープされたシーケンスは圧縮されていない です。

代わりにHttpWebRequestを使用してみましたか?これはWebClientよりも少し面倒ですが、文字列を宛先として渡すことができます。

編集 - エンコードされたバージョンを許可する独自のUriParserを作成することもできます。 UriParserを拡張する例は、found hereです。

その他 Windows Phoneを実行していない場合は、reflectionを使用して修正できます。

MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
if (getSyntax != null && flagsField != null) 
{ 
    foreach (string scheme in new[] { "http", "https" }) 
    { 

     UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme }); 
     if (parser != null) 
     { 
      int flagsValue = (int)flagsField.GetValue(parser); 

      //0x20000 is the SimpleUserSyntax attribute 
      if ((flagsValue & 0x20000) != 0) 
       flagsField.SetValue(parser, flagsValue & ~0x20000); 
     } 
    } 
} 


Uri u = new Uri("http://host.com?arg1=val&arg=val2%3d"); 
//At this point, the %3d remains as expected. 
+0

私はそれを見ません... HttpWebRequest(少なくともWindows Phoneで)は、文字列ベースではないRequestUriプロパティを使用します。 –

+0

@ArianKulp - WebRequestを開始します。http://msdn.microsoft.com/en-私/ライブラリ/ bw00b1dc%28v =対95%29.aspx – keyboardP

+0

私はこれを試しました。それは文字列を受け入れますが、同じエスケープ処理を実行するので、内部的にUriオブジェクトを構築するだけです。アー! –

0

Hammockを試してみてください.Uriではなく文字列を入力する必要があります。

+0

素晴らしい探しフレームワーク。私はそれを聞いたことがなかった。しかし、同じ問題。 –

関連する問題