曲线救国:IIS7集成模式下如何获取网站的URL

如果我们在Global中的Application_Start事件中访问HttpContext.Current.Request对象,如:

        protected void Application_Start()
        {
            var url=HttpContext.Current.Request.Url.ToString();
        }

只是简单的想取一下当前网站的URL。在调试的时候一切正常,但当我们把网站发布到IIS上面的时候,如果IIS应该程序池在集成模式,就会是会报“请求在此上下文中不可用”的异常,但如果是经典模式就不会。dudu这篇文章有详细的说明 http://www.cnblogs.com/dudu/archive/2011/10/14/Application_Start_Context_Request.html

一般来说,解决这个问题,两个方法:

1.将IIS应用程序池改成经典模式

2.不要在Application_Start中访问HttpContext.Current.Request对象。

但是在有些特殊情况下,在集成模式下能不能在Application_Start获取当前站点的URL。

虽然我们不能调用HttpContext.Current.Request对象,但是我们通过System.Web.Hosting.HostingEnvironment.ApplicationID可以获取IIS站点的部署信息。

通过站点的绑定信息间接获取网站的URL.

     void Application_Start(object sender, EventArgs e)
        {
            //var url = HttpContext.Current.Request.Url.ToString();
            var url = GetUrl();
            // 在应用程序启动时运行的代码
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterOpenAuth();
        }

        private string GetUrl()
        {
            string path = System.Web.Hosting.HostingEnvironment.ApplicationID; //值类似于:/LM/W3SVC/3/ROOT
            string url = string.Empty;
            try
            {
                //如果HttpContext可以访问就直接返回通过HttpContext获取的结果
                return HttpContext.Current.Request.Url.ToString();
            }
            catch (Exception)
            {
            }
            // 将Path转换成IIS路径
            path = path.Replace("/LM", "").Replace("/ROOT", "");
            string entPath = string.Format("IIS://localhost{0}", path);
            DirectoryEntry entry = new DirectoryEntry(entPath);
            if (entry.Properties.Contains("ServerBindings"))
            {
                var bingdings = entry.Properties["ServerBindings"].Value.ToString();//得到的结果类似于10.188.188.13:8082:
                //去掉结尾的 : 号
                if (bingdings.EndsWith(":"))
                {
                    bingdings = bingdings.Substring(0, bingdings.Length - 1);
                }
                url = "http://"+bingdings;
            }

            return url;
        }

当然这种方法只适用于我们只需要知道网站域名的情况下,或我们可以确定第一次访问网站的初始页面。

时间: 2024-11-05 15:52:21

曲线救国:IIS7集成模式下如何获取网站的URL的相关文章

IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求

今天将开发好的ASP.NET站点部署到客户的服务器上后,发现了一个非常头疼的问题,那么就是IIS7的应用程序池是集成模式的话,ASP.NET项目中自定义的HttpModule会处理静态文件(.html .css .js .jpeg等)请求,而这不是我预期的效果,因为我只想让托管文件(aspx, ascx 及 MVC等)的请求被自定义HttpModule处理,但是我发现在IIS7的集成模式下所有请求都会进入HttpModule被处理. 后来我尝试将IIS7站点下的应用程序池改为了经典模式,这样的话

IIS8集成模式下打开静态资源被aspx处理程序处理,StaticFileModule失效问题分析

问题描述: 打开js,css,jpg之类的静态资源文件触发了asp.net mvc的权限认证,并不是直接返回静态内容 问题分析: StaticFileModule 失效 ,可能是文件权限问题 问题解决: 由于在集成模式下,默认进程标识是应用程序池名称相同的"用户", 如应用程序池为 tom, 那么在进程管理器中,w3wp.exe的用户即为tom 而IIS中要动态的为这种标识设计权限则需要同时给 IIS_IUSERS组  和  IUSR组设置完全控制权限!!! 记得是同时设置. 如果仅给

微软URLRewriter.dll的url重写在目标框架.Net Framework2.0、4.0和应用程序池经典模式、集成模式下的配置

大家参考几篇园子里面的这篇文章: 文章1:微软URLRewriter.dll的url重写的简单使用 (讲解了使用UrlReWriter.dll的下载.web.config如何在目标框架2.0应用程序池经典模式下配置使用该dll.还有一个web的例子.缺少处理程序映射的设置例子) 文章2:使用web.config中的httpHandlers (讲解了URLRewriter.dll是如何从原理上来处理URL重写地址来转发给真实的服务器地址上的) 文章3:检测到在集成的托管管道模式下不适用的ASP.N

IIS集成模式下,URL重写后获取不到Session值

近期给公司网站添加了伪静态功能,但是今天发现了在伪静态的页面中,Session值是获取不到的. 原因是在伪静态请求的时候,Session请求被“过滤”掉了. 开始是把web.config文件中的modules节点添加runAllManagedModulesForAllRequests="true"属性. <modules runAllManagedModulesForAllRequests="true"> <add name="URLMo

IIS7 应用程序池的 托管管道模式与集成模式小结【转帖】

IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解 IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员尤其有用,因为这样既可以令一台服务器仅运行一种模式,也可以令两种模式同时运行于一台服务器上. 上述两种管道模式使用的web.config文件存在重大的区别,许多在经典管道模式下能够正常工作的web.c

IIS7.5应用程序池集成模式和经典模式的区别【转】

由于最近公司服务器上需要将iis的应用程序池全部都升级到4.0的框架,当然选择4.0就肯定使用集成模式部署.升级过程中出现了比较多的问题,前面文章也提到过几个.这次就主要介绍下httpHandler 和 httpModule 在集成和经典模式下的区别.很多文件上传等都是需要使用到httpModule去实现.我今天就出现了NeatUpload在iis7.5下出现未将对象引用到设计实例的错误.所以用httpModule作为测试案例. 新建测试网站WebApplication,加入MyHttpModu

IIS7.5应用程序池集成模式和经典模式的区别介绍

IIS7.5应用程序池集成模式和经典模式的区别介绍 作者:  字体:[增加 减小] 类型:转载 时间:2012-08-07 由于最近公司服务器上需要将iis的应用程序池全部都升级到4.0的框架,当然选择4.0就肯定使用集成模式部署 升级过程中出现了比较多的问题,前面文章也提到过几个.这次就主要介绍下httpHandler 和 httpModule 在集成和经典模式下的区别.很多文件上传等都是需要使用到httpModule去实现.我今天就出现了NeatUpload在iis7.5下出现未将对象引用到

IIS7 经典模式和集成模式的区别(转载)

转载地址:http://www.poluoluo.com/server/201301/193110.html 升级过程中出现了比较多的问题,前面文章也提到过几个.这次就主要介绍下httpHandler 和 httpModule 在集成和经典模式下的区别.很多文件上传等都是需要使用到httpModule去实现.我今天就出现了NeatUpload在iis7.5下出现未将对象引用到设计实例的错误.所以用httpModule作为测试案例. 1.新建测试网站WebApplication,加入MyHttpM

IIS经典模式集成模式的区别(转载)

在 IIS Metabase 中维护着 Application Pool 和 Worker Process 的Mapping.WAS(Web Administrative Service)根据这样一个 mapping,将存在于某个 Application Pool Queue 的 request 传递到对应的 Worker Process (如果没有,就创建这样一个进程).在 Worker Process 初始化的时候,加载 ASP.NET ISAPI,ASP.NET ISAPI 进而加载 CL