如果我们在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(, bingdings.Length - );
}
url = "http://"+bingdings;
} return url;
}

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

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

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

    今天将开发好的ASP.NET站点部署到客户的服务器上后,发现了一个非常头疼的问题,那么就是IIS7的应用程序池是集成模式的话,ASP.NET项目中自定义的HttpModule会处理静态文件(.html ...

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

    问题描述: 打开js,css,jpg之类的静态资源文件触发了asp.net mvc的权限认证,并不是直接返回静态内容 问题分析: StaticFileModule 失效 ,可能是文件权限问题 问题解决 ...

  3. nginx 代理模式下,获取客户端真实IP

    最近做博友推荐,发现个小问题,用$_SERVER['REMOTE_ADDR'];得到的都是服务器的地址192.168.96.52,搜索了一下,发现问题,改为$_SERVER['HTTP_X_REAL_ ...

  4. 【解决】SharePoint集成模式下Reporting Service—为用户授予的权限不足,无法执行此操作。 (rsAccessDenied)

    环境:Windows Server 2008 R2 SP1,SharePoint 2010 企业版,SQL Server 2008 R2 Reporting Service(SharePoint集成模 ...

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

    大家参考几篇园子里面的这篇文章: 文章1:微软URLRewriter.dll的url重写的简单使用 (讲解了使用UrlReWriter.dll的下载.web.config如何在目标框架2.0应用程序池 ...

  6. Spring MVC模式下,获取WebApplicationContext的工具类 方法

    在已有的注解类型下,获取WebApplicationContext的工具类 通过  WebApplicationContextUtils.getRequiredWebApplicationContex ...

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

    近期给公司网站添加了伪静态功能,但是今天发现了在伪静态的页面中,Session值是获取不到的. 原因是在伪静态请求的时候,Session请求被“过滤”掉了. 开始是把web.config文件中的mod ...

  8. Splunk - 如何在WebFramework之CORS模式下你的网站和splunk web进行交互

    1. 修改配置文件以支持CORS 进入/Applications/Splunk/etc/system/local 修改server.conf 在最后加入如下: [httpServer]crossOri ...

  9. VirtualBox、VMware在桥接模式下无法获取ip地址问题

    声明: 参考 https://blog.csdn.net/lcdcxy/article/details/49362171 https://jingyan.baidu.com/article/948f5 ...

随机推荐

  1. 【Python】[面向对象编程] 访问限制,继承和多态

    1.在Python中两个下划线__ 就是带便私有属性 private   注意已两个下划线开头并且结尾的 如 __init__ 是特殊变量,不是私有变量 2.多态,Python的“file-like ...

  2. Linux 远程复制文件

    Linux 远程复制文件 如果想把机器A上面的dir目录下面的所有文件复制到机器B的dir目录下,我们可以使用nc命令来完成 在机器A的dir目录下面执行: tar -czf - * | nc -l ...

  3. 详解https是如何确保安全的?

    Https 介绍 什么是Https HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是 ...

  4. win7下装ubuntu14.04双系统

    一.给ubuntu准备安装空间 计算机--右键--管理-磁盘管理--选择一个空余空间较多的磁盘--右键--压缩卷--压缩大概60G空间(接下来ubuntu就会装到这60G里面)   二.制作启动u盘 ...

  5. <!DOCTYPE html>作用

    1.定义: DOCTYPE标签是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(DTD)来解析文档. <!DOCTYPE> 声明 ...

  6. 今天遇到sqlyog连接不上阿里云的数据库,最后百度解决了...

  7. ionic browser+ios头部高度显示问题

    ionic项目在使用ionic build browser或者打包ios时如果设置头部高度 方法如下 .bar-header { padding:; height:; } .scroll-conten ...

  8. WinForm------TextEdit只能输入数字

    代码: this.textEdit1.Properties.Mask.EditMask = @"\d+"; this.textEdit1.Properties.Mask.MaskT ...

  9. Java创建对象的几种方法

    有时候,也可能碰到这样面试题,如: Java创建对象有哪几种方法? 除了new之外,java创建对象还有哪几种方式? 本文结合例子,给出几种Java创建对象的方法,Here we go~~~~ 使用n ...

  10. SDL 截图、录像、录像播放

    截图 使用sdl很简单,视频显示窗口大小,不是视频分辨率大小 int i = Sdl.SDL_SaveBMP(surfacePtr, path); if(i != 0) { MessageBox.Sh ...