我试图

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(对象发件人,EventArgs的)方法,其中所述请求上下文是可用的。

编辑:这是由迈克沃洛达尔斯基的博客的启发代码示例,迈克尔Shimmins链接:

    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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top