如果ASP.NET程序以IIS集成模式运行,在Global.asax的Application_Start()中,只要访问Context.Request,比如下面的代码

var request = Context.Request;

就会引发异常:

Request is not available in this context

不信你可以试试。

这个问题只会出现在IIS集成模式(Integrated),如果改为传统模式(Classic),问题就不会出现。

今天就被这个问题小小折腾了一下。我们在错误日志模块中增加了记录当前访问网址的操作,这样,发生错误时,我们可以准确地知道引发错误的访问网址。我们添加了下面这样的

代码:

HttpContext context = HttpContext.Current;
if (context != null && context.Request != null && context.Request.Url != null)
{
    return context.Request.Url.AbsoluteUri;
}

然后将更新的日志模块部署到服务器上,在一个应用中却出现“Request is not available in this context”异常,如下图:

从上面的异常信息可以看出,异常发生于在Application_Start中访问HttpContext的Request属性时(该应用在Application_Start进行了日志记录操作,所以访问了HttpContext.Request)。

用ILSpy查看HttpContext的

代码:

internal bool HideRequestResponse;

public HttpRequest Request
{
    get
    {
        if (this.HideRequestResponse)
        {
            throw new HttpException(SR.GetString("Request_not_available"));
        }
        return this._request;
    }
}

可以看出,这个异常是在HideRequestResponse == true时扔出的,也就是说在Application_Start阶段,HideRequestResponse的值是true。

让人困惑的地方是既然在HideRequestResponse == true时不允许访问Request属性,那HttpContext为什么不提供一种方式让调用者知道——“此时严禁调用Request”。如果调用者调用前可以检查一下相关规定,就不用这么既浪费感情,又要付出代价(捕获这个HttpException)。

另外,我们的需求只是想得到当前请求的URL,不能访问Request,我们就不能得到这个URL。难道在Application_Start时就不能得到当前请求的URL,这个URL是从外部(IIS)传递给ASP.NET Runtime的,与ASP.NET Runtime的状态根本无关,有点想不通。。。

无奈,只能将就着先把问题解决,通过捕获异常进行判断,

代码如下:

HttpContext context = HttpContext.Current;
if (context != null && context.Request != null && context.Request.Url != null)
{
    try
    {
        return context.Request.Url.AbsoluteUri;
    }
    catch (Exception ex)
    {
        if (ex is HttpException)
        {
            return string.Empty;
        }
    }
}

遭遇ASP.NET的Request is not available in this context的更多相关文章

  1. Asp.net中Request.Url的各个属性对应的意义介绍

    Asp.net中Request.Url的各个属性对应的意义介绍 本文转载自 http://www.jb51.net/article/30254.htm 网络上关于Request.Url的说明已经很多也 ...

  2. 【asp.net】asp.net遍历Request的信息

    #需求: 在服务端获取从客户端发送过来的所有数据信息: #方案: 1.服务端代码 public void ProcessRequest(HttpContext context) { //打印所有参数信 ...

  3. Asp.net MVC Request Life Cycle

    Asp.net MVC Request Life Cycle While programming with Asp.net MVC, you should be aware of the life o ...

  4. Request is not available in this context

    部署到新服务器的IIS的时候发现这个错误: Request is not available in this context 解决方案: <system.web> <customEr ...

  5. Asp.net的request类

    ASP.NET获取客户端信息,暂时就这几个,有待添加~~ 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取 ...

  6. 遭遇Asp.Net长文件名下载的问题和解决办法

    在Asp.Net中写了一个附件上传和下载的程序,附件上传到数据库中,然后将附件的GUID保存起来,我们可以根据GUID来找到数据库中的附件,一般附件下载的代码是: <!--<br /> ...

  7. ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath、Server.MapPath(转载)

    1.Request.ApplicationPath->当前应用的目录   Jsp中, ApplicationPath指的是当前的application(应用程序)的目录,ASP.NET中也是这个 ...

  8. ASP.NET 中Request.QueryString 中的key

    在ASP.net中 的Key是可能为null的,例如在如下的Url中 http://localhost:14546/Home/Index?a 有一个key=null 其value是a,以前一直以为ke ...

  9. asp.net中Request.ServerVariables的用法

    在asp.net中可以通过HttpRequest.ServerVariables 属性来获取“ Web 服务器变量的集合” HttpRequest.ServerVariables 的用法: HttpR ...

随机推荐

  1. Vim的合并行操作

    日常常用到多行合并的功能,记录如下: 第一种, 多行合并成一行,即: AAAAABBBBBCCCCC 合并为:AAAAA BBBBB CCCCC 方法1: normal状态下 3J 其中的3是范围,可 ...

  2. playbook role应用

    参考: ansible中文权威指南 1. 动态Include 结合when等判断,在满足某个条件的时候加载. - include: test.yml when: ...... handler 中也可以 ...

  3. IO流-学习使人快乐2

    io流原理总结https://www.cnblogs.com/loong-hon/p/4890232.html io流代码整理https://www.cnblogs.com/whgk/p/532656 ...

  4. LoadRunner录制协议的选择

    1.选择协议(提高测试结果的准确性) New Single Protocol Script:单协议脚本,选择一种主协议进行测试 New Multiple Protocol Script:多协议脚本,选 ...

  5. 组合数的简单求法(dfs)

    组合数的具体应用可以参考这个例子:https://www.cnblogs.com/FengZeng666/p/10496223.html 下面这段代码可以作为求组合数的固定套路或者公式: #inclu ...

  6. spring框架等web程序在tomcat下的启动顺序

    http://www.cnblogs.com/panxuejun/p/5847774.html

  7. 解决每次调试网页,eclipse总是提示edit source lookup path的问题,我的第一篇小随笔,小激动呢

    如图,很简单,只要把想要debug的项目勾上就行,网页调试时,就会自动去找项目文件位置

  8. 10个非常有趣的Linux命令【转载】

    Linux当中有很多比较有趣的命令,可以动手看看,很简单的. 1.rev命令 一行接一行地颠倒所输入的字符串. 运行: $rev 如输入:shiyanlou shiyanlou rev.jpg 2.a ...

  9. POJ1700----Crossing River

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...

  10. codeforces723----C. Polycarp at the Radio

    //AC代码...表示很晕 #include <iostream> using namespace std; ],b[]; int main() { int n,m,cnt; cin &g ...