如何在Global.aspx的Application_Start中获取完整的主机名和端口号?

我试过了

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的链接所启发:

  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 :) } 

只要回答这个问题,如果有人决定真的search这个话题…

这适用于任何模式下的应用程序启动…

 typeof(HttpRequest).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)