2012-05-01 21 views
3

私はすべてのWebプロジェクトで使用する汎用ライブラリを作成しています。機能の一つは、以下のように恒久的なリダイレクトです:相対パス( "〜")を現在のページを参照せずに解決しますか?

public static void PermanentRedirect(string url, HttpResponse response, bool endResponse) 
{ 
    url = //resolve url here. how? 

    response.Status = "301 Moved Permanently"; 
    response.AddHeader("Location", url); 

    if (endResponse) response.End(); 
} 

どのように私はPage.ResolveUrlへのアクセスを取得するには、現在のページを渡すことなく、URLを解決することができますか?注:私はに変更することができますが、私はそれがAPIに負担をかけると考えています。

私はこのように私の希望の使用のためのカップルのオーバーロードを持つがある:あなたがHttpContext.Handlerを経由して、現在のページのインスタンスを取得することができます

WebUtility.PermanentRedirect("~/somewhere/somepage.aspx") 
+0

その場合、* '〜'はどういう意味ですか? (2つの引数を持つURIコンストラクタが "期待どおりに"それを扱うと信じています。)それ以外の場合は取得できない場合は、HttpContextからページに直接アクセスできます。 –

+0

'〜'は、Webアプリケーションルートにマップする通常のWebアプリケーションルート演算子です。 Uriのコンストラクタに関して、 '新しいUri(string uriString、bool dontEscape)'を参照していますか?これは減価償却され、私はもう一方が適用されるかどうかはわかりません。 – Jeff

答えて

4

私はあなたがチルダの直接の代替としてHttpRuntime.AppDomainAppVirtualPath使用することができると信じています。

VirtualPathUtility.ToAbsoluteも使用できますが、クエリ文字列は好きではないため、解析する必要があります(または、UriBuilderを使用することをお勧めします)。

オフトピックではありますが、IMHO拡張メソッドでHttpResponseをオフにすると、構文が簡単になります。

+0

拡張メソッドはいい考えです。先端に感謝します。 – Jeff

1

var page = HttpContext.Current.Handler as Page; 
if (page != null) 
{ 
    // Use page instance, f.e. page.Request.Url; 
} 

ところで、あなたは必要ありません。

HttpResponse response = HttpContext.Current.Response; 

http://msdn.microsoft.com/en-us/library/system.web.httpcontext.response.aspxHttpResponseのいずれかを渡します

+0

ありがとうTim。私はより明確にすべきだった。私はページ全体を参照しないようにしたいと思います。私はその制約を強制するのが無理だと思いますか?そのようにしなければならないのはちょっと壊れやすいようです。 – Jeff

+1

@Jeff:なぜあなたはそれを参照せずに現在のページのURLをしますか?もちろん、Web以外のプロジェクトで呼び出された場合は脆弱です。しかし、そうではありません。 –

+0

'HttpContext.Current.Handler'を参照せずにそれを行う方法があるはずです。ページを参照する必要があると、ユニットテストのような非標準的なシナリオでは複雑になる依存関係が導入されます。 – Jeff

2

This method should work

url = VirtualPathUtiliy.ToAbsolute(url); 
+0

+1私はちょうどOPが何を求めているのか理解しています。彼はただそのURLを解決したい。 –

+0

@StriplingWarriorはい。これは私がやろうとしていたものです。ありがとう。 – Jeff

関連する問題