谁能告诉我是否有办法在 global.asax 的 Application_Start 事件中获取我网站的域名?
通常我只是从 Context.Request.ServerVariables["SERVER_NAME"] 获取它,但这不可用。理想情况下,我还想从启动应用程序的请求中获取 URL。
嗯 - 从下面的答案来看,使用 IIS7 似乎会有所不同。这是新的,现在有设计指南来尝试阻止您这样做:
您可以通过静态 HttpContext.Current 成员访问 Context。
HttpContext.Current.Request.ServerVariables["SERVER_NAME"];
HttpContext.Current.Request.Url;
编辑,根据您的一些评论,我做了一些额外的研究
此错误是由于 IIS7 集成管道中的设计更改导致请求上下文在 Application_Start 事件中不可用。当使用经典模式(在早期版本的 IIS 上运行时的唯一模式)时,请求上下文过去是可用的,即使 Application_Start 事件始终被设计为应用程序生命周期中的全局且与请求无关的事件。尽管如此,由于 ASP.NET 应用程序始终由对应用程序的第一个请求启动,因此过去可以通过静态 HttpContext.Current 字段获取请求上下文。
所以你有两个选择
您的网络应用程序可以在多个不同的域下运行。由于
Application_Start
事件中没有当前请求,因此您无法知道应用程序将在哪个域下被调用。
但是,您可以使用
System.Environment.MachineName
找到机器名称。
我猜您使用的是 IIS 7?因为 HttpContext 在 IIS 6.0 上可用。
您可以考虑稍后填写该信息吗?例如,第一次调用
Application_BeginRequest
?
在 VB.NET 中,在 Global.asax 中,我使用以下内容:
Hosting.HostingEnvironment.ApplicationHost.GetSiteName
对应IIS中的应用程序名称。
更新: 似乎方法“GetSiteName”不打算直接调用,并且它在 Visual Studio 2015 中不再对我有用(或者可能是因为我所做的框架版本更改)。我通过将其替换为来修复它:
System.Web.Hosting.HostingEnvironment.SiteName
void ISessionIDManager.SaveSessionID(HttpContext上下文,字符串id,out bool重定向,out bool cookieAdded) { base.SaveSessionID(上下文,id,输出重定向,输出cookieAdded);
if (cookieAdded)
{
SessionStateSection sessionStateSection = (System.Web.Configuration.SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
var cookie = context.Response.Cookies[sessionStateSection.CookieName];
cookie.Path = context.Request.ApplicationPath;
}
}
我创建这个类并添加到 web.config 标签下面 另外,之后该路径不再显示,而是使用 ASP.NET
你尝试过吗:-
System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"]
谢谢,
菲尔。