我负责运维一个短信接口站点sms。调用上游短信供应商下发短信后,他们会给我们推送发送报告。报告是类似DELIVRD、DI:9432这样的码。为了方便识别,系统里有一个报告码与其描述的关系,一开始是写死在程序里的。这样的弊端是,后期每次添加了这个映射关系后,都要更新网站程序,增大了维护成本。
为了降低维护成本,我做了改进方案。
将这个映射关系保存到一个文本文件ReportCodeMapper.txt里,提供一个页面来允许修改这个文件的内容。 对于使用的逻辑,声明一个静态的Dictionary,初始化时从这个文本文件里读取出来再做转换add到这个Dictionary里。 类文件结构如下:

文件是保存在站点下的,所以在读取的时候需要调用Server.MapPath方法来得到其物理文件路径。由于使用逻辑在SmsSDK类库里,我要添加引用System.Web,然后借助System.Web.HttpContext.Current.Server.MapPath。
很快,我驾轻就熟写完了代码。
发布之后,发现程序在每次处理推送的报告时都会报异常:

时间:-- ::
读取文件异常:System.NullReferenceException: 未将对象引用设置到对象的实例。
在 SmsSDK.ReportCodeMapper..ctor()

由于这次上线同时改动的代码逻辑比较多,我丝毫没怀疑是文件解析报的异常。

于是,进一步在必须的地方加日志。再进行模拟流请求操作,再监控记录的日志。 这样几次下来,最终发现还真是HttpContext.Current为null导致的。
问题是定位到了,然后就感到疑惑, 用一般处理文件(.ashx)来发布的接口,被流请求调用时HttpContext.Current是null?
开始排障:模拟报告推送需要指定xml格式的参数,为了快速定位问题,我找了个.ashx文件,在其ProcessRequest(HttpContext context)方法首行调用ReportCodeMapper.GetDesc方法,模拟流请求调用这个.ashx接口,发现正常。
这增加了我的疑惑。由于时间近夜半,于是回滚了版本。

次日来公司后,再继续排查,最终发现,原因出在我在调用AddRecord方法时,使用了线程池。这才豁然。见下图:

儿时记得看过一篇课文,说有个农夫要寻觅一颗草药,他每天爬山去找寻,但一直无果。在将要灰心的放弃时,意外发现他苦苦寻觅的草药,就在他每天经过的山脚下。
其实,问题的原因,只要用心认真细致的追查,你会发现,原因很简单。

http流请求时,被请求站点HttpContext.Current为null?的更多相关文章

  1. .net webapi 中使用session是出错 HttpContext.Current.Session==null

    最近在写.net webapi时发现 HttpContext.Current.Session==null  ,导致报错,后来查资料发现webapi中使用session时首先需要开启session功能, ...

  2. ASP.NET多线程下使用HttpContext.Current为null解决方案 2015-01-22 15:23 349人阅读 评论(0) 收藏

    问题一:多线程下获取文件绝对路径 当我们使用HttpContext.Current.Server.MapPath(strPath)获取绝对路径时HttpContext.Current为null,解决办 ...

  3. ASP.NET多线程下使用HttpContext.Current为null解决方案 2015-01-22 15:23 350人阅读 评论(0) 收藏

    问题一:多线程下获取文件绝对路径 当我们使用HttpContext.Current.Server.MapPath(strPath)获取绝对路径时HttpContext.Current为null,解决办 ...

  4. ASP.NET多线程下使用HttpContext.Current为null解决方案

    多线程或者异步调用中如何访问HttpContext? 前面我还提到在APM模式下的异步完成回调时,访问HttpContext.Current也会返回null,那么此时该怎么办呢? 答案有二种:1. 在 ...

  5. HttpContext.Current为NULL

    总结:HttpContext.Current是基于System.Runtime.Remoting.Messaging.CallContext这个类,子线程和异步线程都无法访问到主线程在CallCont ...

  6. 多线程中使用HttpContext.Current为null的解决办法

    HttpContext.Current.Server.MapPath(logFile)   这个是得到具体路径的方法  正常情况下是可以的 多线程情况下就为null 下边的代码原本的作用是把网站的异常 ...

  7. 解决Asp.net Mvc中使用异步的时候HttpContext.Current为null的方法

    在项目中使用异步(async await)的时候发现一个现象,HttpContext.Current为null,导致一系列的问题. 上网查了一些资料后找到了一个对象: System.Threading ...

  8. 异步任务,HttpContext.Current为null解决办法

    最近在开发一个后台管理系统项目,为了提高登录的速度,就把记录登录日志放到一个异步任务里面. Action taskAction = () => { SaveLog(); }; Task task ...

  9. HttpContext.Current.Session=null问题

    启用asp.net状态服务,可以让Session持久化!

随机推荐

  1. Ubuntu 16.04 下使用Xampp

    Ubuntu 16.04 下使用Xampp 什么是Xampp? XAMPP(Apache+MySQL+PHP+PERL) 是一个功能强大的建站集成软件包.这个软件包原来的名字是 LAMPP,但是为了避 ...

  2. Mac下升级Nodejs

    突然发现系统中的nodejs版本比较旧,想升级一下但又不想下载安装包一步一步安装, 发现还是可以很简单用命令行升级的. 首先得清理npm的缓存 sudo npm cache clean -f 安装 n ...

  3. [转]Android开发:Parallax效果的ScrollerView,改编自ParallaxListView

    https://github.com/nirhart/ParallaxScroll这个gethub上的地址 本文转自http://www.2cto.com/kf/201502/376970.html ...

  4. [转] How to Show Usual Winform as View in XAF

    How to Show Usual Winform as View in XAF http://www.codeproject.com/Tips/464188/How-to-Show-Usual-Wi ...

  5. selenium 富文本框处理

    selenium 富文本框处理, 网上有用API的解决方法1:参见:http://blog.csdn.net/xc5683/article/details/8963621 群里1位群友的解决方法2:参 ...

  6. php跨域请求

    跨域api服务器设置 header('content-type:application:json;charset=utf8'); header('Access-Control-Allow-Origin ...

  7. Android--数据解析

    一.XML解析: 1.Pull 解析方式: 1)先获取到一个 XmlPullParserFactory 的实例, 并借助这个实例得到 XmlPullParser 对象: 2)调用 XmlPullPar ...

  8. HTML5实战1

    第一章 1.搭建环境,wamp 2.检查浏览器是否支持html5 ,是否支持新标签<canvas></canvas> 3.简单高效,少用id,多用标签. 4.使用css3美化样 ...

  9. System.DateTimeOffset 中新增的Unix 时间戳方法

    // System.DateTimeOffset [__DynamicallyInvokable] public static DateTimeOffset FromUnixTimeMilliseco ...

  10. 据说练就了一指禅神功的觅闻实时手机新闻网,正以每天2000+IP的用户量递增。有智能手机的可以当场进行体验,没有的就算了哈

    据说练就了一指禅神功的觅闻实时手机新闻网,正以每天2000+IP的用户量递增.有智能手机的可以当场进行体验,没有的就算了哈 觅闻实时手机新闻网  http://m.yunxunmi.com 在IOS. ...