C# 如何获取完整的主机名+;Global.aspx的应用程序启动中的端口号?
我试过了C# 如何获取完整的主机名+;Global.aspx的应用程序启动中的端口号?,c#,asp.net,url,request,hostname,C#,Asp.net,Url,Request,Hostname,我试过了 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应用程序启动
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请求 您可能需要处理并定义请求上下文可用的应用程序_BeginRequest(objectsender,EventArgs e)方法 编辑:以下是一个代码示例,其灵感来自Michael Shimins链接到的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\u Start
事件,每个用户大约每20分钟调用一次(不确定会话的有效时间)<代码>应用程序_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)
这不应该是
Uri=context.Request.Url代码>也不能将下一行简化为仅uri.GetLeftPart(UriPartial.Authority)代码>这也应该是一个静态类,您不需要初始化主机。因此,在第一个HTTP请求到达之前,确实没有办法获取端口号?实际上没有。ASP.NET网站可以有多个绑定,它可以在多个主机和多个端口号下运行(例如,网站的安全和非安全版本). 您只有一个web应用程序实例正在运行,传入的请求包含关于发起请求的主机的信息。web应用程序只知道它是一个应用程序,它没有运行在哪个主机下的真实上下文。如果您的应用程序有两个绑定,一个用于端口80,另一个用于端口8080,您想要哪一个?你不知道,这就是为什么你希望它是基于每个请求的。这是一个非常优雅的解决方案。我发现需要在应用程序启动时获取“基本”域,并在JIT应用程序时使用它。我最终将逻辑转移到Begin_请求中。应用程序\u Start现在为空,Begin\u请求包含逻辑和一个简单的域是否为空的检查。请注意,字段是非公共的(即私有的)。您应该非常小心地使用非文档化的功能和字段,因为它们可以在没有进一步信息的情况下进行更改。它与HttpContext.Current.Request
???我看到同样的结果,听起来就像你在集成模式下运行,而不是经典模式(我认为你在本地运行)。问题是请求在IIS7中的应用程序_Start中不可用。请看:这很好地解释了这一点。另请参阅,以获得从URL获取scheme+主机+端口的更简洁的方法(一旦有了URL)。