当前位置: 首页 > news >正文

遭遇ASP.NET的Request is not available in this context

前一篇文章抱怨了一下ASP.NET FormsAuthentication的设计,这篇文章要抱怨一下HttpContext的设计。

如果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;
}
}
}

后续文章:关于在Application_Start中访问Context.Request

相关文章:

  • 【转】Stephen Wolfram写的乔布斯的回忆录
  • Oracle 存储过程和包的使用
  • oracle中int与number的区别
  • Reg“.NET研究”exOptions.Compiled的含义和使用
  • Silver“.NET研究”light 游戏开发小技巧:升级和传送点特效1
  • MPLS 原理
  • Web.config 加密与解密
  • Axis2附件传输
  • MeeGo开发“.NET研究”进程通信核心 DBus调试工具
  • 偶有所感
  • MPLS 原理详解
  • [翻译]WP7 QuickStart-第八篇-屏幕方向
  • WISEGATE:SIEM的最佳实践讨论
  • 庆祝自己的BLOG之旅开启
  • Silverlight 苹果风格按钮Mac OS Style 实现的更新版
  • chrome扩展demo1-小时钟
  • docker python 配置
  • leetcode-27. Remove Element
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • PHP变量
  • Protobuf3语言指南
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • ubuntu 下nginx安装 并支持https协议
  • vue-router的history模式发布配置
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 使用putty远程连接linux
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一个SAP顾问在美国的这些年
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2020)Java后端开发----(面试题和笔试题)
  • (Forward) Music Player: From UI Proposal to Code
  • (搬运以学习)flask 上下文的实现
  • (二十三)Flask之高频面试点
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (四)Android布局类型(线性布局LinearLayout)
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • *** 2003
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .java 9 找不到符号_java找不到符号
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net和php怎么连接,php和apache之间如何连接
  • .NET中 MVC 工厂模式浅析
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [20171113]修改表结构删除列相关问题4.txt
  • [AIGC] Java 和 Kotlin 的区别
  • [AIGC] 如何建立和优化你的工作流?