私は試した
Uri uri = HttpContext.Current.Request.Url;
String Host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
そして、それは私のローカルマシンでうまく機能しましたが、IIS7に公開されているとき、例外があります
System.Web.HttpException: Request is not available in this context
誰もこれを達成する方法を知っていますか?
Webアプリケーションが起動すると、HTTPリクエストは処理されません。
リクエストコンテキストが利用可能なApplication_BeginRequest(Object Sender、EventArgs e)メソッドを定義することもできます。
編集: Michael ShimminsがリンクしたMike Volodarskyのブログに触発されたコードサンプルを次に示します。
void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication app = (HttpApplication)source;
var Host = FirstRequestInitialisation.Initialise(app.Context);
}
static class FirstRequestInitialisation
{
private static string Host = null;
private static Object s_lock = new Object();
// Initialise only on the first request
public static string Initialise(HttpContext context)
{
if (string.IsNullOrEmpty(Host))
{
lock (s_lock)
{
if (string.IsNullOrEmpty(Host))
{
var uri = context.Request.Url;
Host = uri.GetLeftPart(UriPartial.Authority);
}
}
}
return Host;
}
}
受け入れられた答えは良いですが、ほとんどの場合(最初のリクエストがHTTPリクエストの場合)、Session_Start
イベント。ユーザーごとに20分ごとに呼び出されます(セッションの有効期間は不明です)。 Application_BeginRequest
は、リクエストごとに発生します。
public void Session_Start(Object source, EventArgs e)
{
//Request / Request.Url is available here :)
}
これに答えるだけで、誰かがこのトピックを実際に検索することに決めたら...
これは、どのモードでもアプリケーションの起動時に機能します...
typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)