我负责运维一个短信接口站点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. Oracle数据导入导出

    Oracle数据导入导出imp/exp 在oracle安装目录下有EXP.EXE与IMP.EXE这2个文件,他们分别被用来执行数据库的导入导出.所以Oracle数据导入导出imp/exp就相当与ora ...

  2. c#下调用dll动态链接库[转]

    C# 调用传统的 API 动态链接库,是.NET开发经常被讨论的问题. 比如有这么一个动态链接库(delphi 语言): library DelphiDLL; uses SysUtils, Class ...

  3. 封装ios静态库碰到的一些问题(一)

    封装IOS动态库,碰到的第一个问题,就是资源文件的问题,如果将你的程序封装成为静态库,那么静态库中不会包含资源文件和xib文件,这个时候就需要自己封装bundle文件了,而笔者开发环境默认是xcode ...

  4. js复制内容加版权声明代码

    $("body").on('copy', function (e) { if (typeof window.getSelection == "undefined" ...

  5. ArcGIS Engine10.2如何安装在 VisualStudio2013 开发环境下

    所谓工欲善其事必先利其器,10.2中的ArcObject SDK for Microsoft .Net Framework只能支持VS2010和VS2012环境. 那么如何在VS2013下安装呢? 准 ...

  6. linux下rm -r误删NTFS文件恢复方法

    一时疏忽,手一抖,把整个挂载的F盘删了一半!顿时傻眼!! 被删的F盘是Windows下NTFS分区,在Ubuntu12.04中挂载了F盘,使用rm命令时粗心大意,误删了一半的数据. 血的教训告诉我们, ...

  7. EDA技术与ASIC设计和FPGA开发有什么关系?FPGA在ASIC设计中有什么用途?

    利用EDA技术进行电子系统设计的最后目标是完成专用集成电路ASIC的设计和实现:FPGA和CPLD是实现这一途径的主流器件.FPGA和CPLD通常也被称为可编程专用IC,或可编程ASIC.FPGA和C ...

  8. ant 的详细的入门教程

    Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能.在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作. 一.            ...

  9. LinqToEntity模糊查询的方法选择

    LinqToEntity针对oracle模糊查询 方法:Contains() 转换出来的sql是  like  关键字 方法:IndexOf()  转换出来的sql是  instr()  函数 lik ...

  10. H264与RTP

    http://blog.163.com/laorenyuhai126@126/blog/static/1935077920111218152989/