我负责运维一个短信接口站点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. 关于maven中央仓库jar包不存在问题

    最近接手一个maven项目,引入依赖的时候报了一个 Missing artifact com.oracle:ojdbc6:jar:12.1.0.1 pom.xml 的错误,网上一查,原来是Oracle ...

  2. [转]SQL Server表锁定原理以及如何解除锁定

    2010年10月13日 12:46 来源:部松昌的博客 作者:部松昌 编辑:胡铭娅 一: 下面以AdventureWorks2008为示例数据库做简要的说明,过滤掉一般的数据库的共享锁, 作为示例必须 ...

  3. BZOJ 1047: [HAOI2007]理想的正方形

    题目 单调队列是个很神奇的东西,我以前在博客写过(吧) 我很佩服rank里那些排前几的大神,700ms做了时限10s的题,简直不能忍.(但是我还是不会写 我大概一年半没写单调队列,也有可能根本没有写过 ...

  4. Linux 忘记root登录密码解决方法

    很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步骤如下: 重启linux系统 3  ...

  5. MVC 单元测试

    1.新建mvc项目 添加controller 添加action 或者方法 public ActionResult Index(string str) { ViewBag.Teststr = str; ...

  6. C语言小练习二

    题目要求: 编程实现功能:将4行4列数组的左下三角设置为下图所示的数据.43 7 2 6 91 5 8 10 程序源码: #include <stdio.h> int main(void) ...

  7. 【洛谷P3143】Diamond Collector

    算是一道dp 首先,排序好每一个架子上都是一段区间,然后只需要统计每个点向左向右最长延伸的区间. 所以我们预处理出每个点以左.以右最大能延伸的长度(最多能选几个差值不超过k的) 然后枚举每个点作为断点 ...

  8. noip2008-t3

    [题目描述] 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸 ...

  9. 时空地图TimeGIS 可编辑ArcGIS的Shape矢量文件的地理信息系统

    时空地图 TimeGIS 6.0 是一个地理信息系统软件,它可以显示网络地图,编辑ArcGIS的SHP矢量文件格式,显示NETCDF等栅格文件,管理图层等. 在它的基础上,可以二次开发各种GIS应用, ...

  10. Allegro Out Of Date Shapes原因及解决方法

    使用Allegro设计PCB板时,查看Status,经常会遇到out of date shapes的警告信息,具体如下: dynamic shape is still out of data or e ...