博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
遭遇ASP.NET的Request is not available in this context
阅读量:6113 次
发布时间:2019-06-21

本文共 1724 字,大约阅读时间需要 5 分钟。

文章抱怨了一下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; } } }

后续文章:

转载地址:http://facka.baihongyu.com/

你可能感兴趣的文章
GitLab版本管理
查看>>
swt,jface,rcp
查看>>
iOS之小功能模块--彩虹动画进度条学习和自主封装改进
查看>>
[LeetCode] Strobogrammatic Number II 对称数之二
查看>>
maven pom.xml具体解释(整理)
查看>>
通过Java字节码发现有趣的内幕之String篇(上)(转)
查看>>
第十七章 springboot + devtools(热部署)
查看>>
asp.net mvc 之旅—— 第四站 学会用Reflector调试我们的MVC框架代码
查看>>
JS获取/设置iframe内对象元素、文档的几种方法
查看>>
Matlab基本数据类型
查看>>
IDEA Community(社区版) 使用Maven创建Web工程 并部署tomcat
查看>>
C基础--关于typedef的用法总结
查看>>
mongodb 简单部署方案及实例
查看>>
thinksns解析1
查看>>
自定义可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers)vs.net开发工具
查看>>
JavaScript:JavaScript中常见获取对象元素的方法
查看>>
javax.mail用smtp服务器发送带附件的邮件
查看>>
Linux命令-grep
查看>>
十分钟学会写shell脚本
查看>>
POJ1651Multiplication Puzzle[区间DP]
查看>>