49

我试过了

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

任何人都知道如何实现这一目标?

4

3 回答 3

60

当您的 Web 应用程序启动时,不会处理任何 HTTP 请求。

您可能想要处理定义 Request 上下文可用的 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;
        }
    }
于 2010-11-22T07:46:48.367 回答
9

接受的答案很好,但在大多数情况下(如果第一个请求是 HTTP 请求),您最好使用该Session_Start事件,每个用户每 20 分钟左右调用一次(不确定会话的有效时间)。 Application_BeginRequest将在每个请求时被解雇。

public void Session_Start(Object source, EventArgs e)
{
   //Request / Request.Url is available here :)
}
于 2013-12-05T13:43:36.157 回答
2

只是回答这个问题,所以如果有人决定实际搜索这个主题......

这适用于以任何模式启动应用程序...

typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)
于 2015-03-19T20:48:02.813 回答