2008-09-10 14 views
2

Webフォームで生成されているasp.net urlパスがあり、 "/foo/bar/../bar/path.aspx"のようなものが出てきていますこのように生成されたHTMLでも出てきます。 「/foo/bar/path.aspx」に短縮する必要があります。Asp.netパス圧縮

Path.Combineは修正しませんでした。この経路をきれいにする機能はありますか?

答えて

4

あなたはSystem.Net

で、このように使用することができ
public static class UriHelper 
{  
    public static string NormalizeRelativePath(string path) 
    { 
     UriBuilder _builder = new UriBuilder("http://localhost"); 
     builder.Path = path; 
     return builder.Uri.AbsolutePath; 
    } 
} 

UriBuilderクラスをラップするヘルパークラスを作成できます。

string url = "foo/bar/../bar/path.aspx"; 
Console.WriteLine(UriHelper.NormalizeRelativePath(url)); 

それは少しハックですが、それが働くだろうしあなたが与えた具体例のために。

EDIT:アンドリューのコメントを反映して更新されました。

0

皮肉の応答はあまり良く鉱山よりもですが、ファイルシステムのパスを使用していた場合、以下の私醜いハックはあまりにも有用であることが判明できました。 (翻訳:私はそれを入力したので、私はそれを投稿していない場合、私はのろわれたよ:)

Path.Combineはちょうどスラッシュを先頭または末尾に注意を払って、一緒に2つの文字列をピタッ。私が知る限り、正規化を行う唯一のPathメソッドはPath.GetFullPathです。以下はあなたに "クリーンアップ"バージョンを与えるでしょう。もちろん

myPath = System.IO.Path.GetFullPath(myPath); 

、結果のパスはルート権限を取得され、スラッシュが(のような「C:\ fooという\バー\ path.aspx」)スラッシュをバックに変換されるという小さな問題があります。しかし、元のパスの親ルートを知っていれば、ルートを削除することは大きな問題ではありません。

1

何をしても、静的なUriBuilderは使用しないでください。これは、負荷が重くなるまで検出できない可能性のあるあらゆる種類の競合状態を引き起こします。

同時にUriHelper.NormalizeRelativePathと呼ばれる2つの異なるスレッドは、1の戻り値を任意に他の呼び出し元に戻されることができれば。

あなたは(それが作成するために高価ではありません)それを必要とするときだけ新しいものを作成し、これを行うためにUriBuilderを使用したい場合。

+0

@Andrew静的なUrlBuilderインスタンスについての非常に良い点。私はマルチスレッドの神々への許しを祈ります。 –