UriクラスのQueryプロパティに"?"は含まれる

そんな訳はないだろうと決め付けていたので検証していなかった自分が悪いのだが、実は標題の通りだった。

以前のエントリでは、ClickOnceアプリケーションでURLに指定されたクエリパラメタを取り込む方法を書いたが、この時のコード

string url = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
string queryString = (new Uri(url)).Query;

に、実際にクエリパラメタを付加したURL "http://hoge/hogeapp.application?param1=value1¶m2=value2"を食わせると、queryStringの内容は"?param1=value1¶m2=value2"となる。つまりクエリパラメタの区切り文字だと思っていた、クエスチョン("?")はクエリ文字列に含まれるのである。?を省いた、純粋なクエリパラメタを取得するにはトリムが必要だ。

string url = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
string queryString = (new Uri(url)).Query.TrimStart(new char[]{'?'});

はい、確認しなかった私が悪いですか、そうですね。

追記

"さすらいの.NETプロ"さんに、この場合はQueryプロパティではなく、GetComponentsメソッドを使うべきというアドバイスを頂いた。

string url = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
string queryString = (new Uri(url)).GetComponents(UriComponents.Query, UriFormat.UriEscaped);

こうすればアドホックなトリムも不要だ。それにしても、さすらいの.NETプロさんとは違い、私は全然プロじゃないな。しょんぼりだ。