我负责运维一个短信接口站点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. .net 微信分享功能

    微信在国内目前无疑是最火的社交软件,智能手机装机必备. 微信api有java,php,Python语言的demo, 为毛没有C#的范例?兄长今天给各位带来一个.不叫哥(割)了,A股今天又暴跌[3912 ...

  2. NABCD

    1) N (Need 需求) 随着科学技术的进步和计算机行业的迅速发展,人们的工作效率得到大大提高.计算机信息处理系统的引进已彻底改变了许多系统的经营管理. 图书管理系统是学校管理机制中的重要组成部分 ...

  3. 17.iOS App设置icon,启动图,App名称的方法

    icon:选择Assets-->AppIcon-->将各种尺寸的icon拖拽到相应的框中. APP名称:选择info-->Bundle name,修改APP名字. 启动图: 首先点击 ...

  4. Spring aop 原始的工作原理的理解

    理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...

  5. JavaScript-永远点不到的小窗口

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. flask_用户信息和头像

    一.用户信息页 1.创建视图函数(microblog.py) @app.route('/user/<nickname>') @login_required def user(nicknam ...

  7. node开发

    1. 国内使用npm安装某些插件的时候,偶尔会有网络问题,可以使用cnpm:(后续所有使用 npm 无法正常安装的,都改成 cnpm 试试) a. 首先使用 npm 安装 cnpm:npm insta ...

  8. Postman-CI集成Jenkins

    Postman-简单使用 Postman-进阶使用 Postman-CI集成Jenkins Newman 官方说明:Postman's command-line companion lets you ...

  9. petapoco 使用 MiniProfiler Glimpse监控

    PetaPoco是一款适用于.Net(window) 和Mono( linux )的微小.快速.单文件的微型ORM. MVC MiniProfiler是Stack Overflow团队设计的一款对AS ...

  10. hdu 5720

    考虑三个树枝:a,b,c若c是将要抛出的树枝,那么形成三角形的条件是a+b>c and a-b<c 可以写成 c属于开区间(a-b,a+b)对于每个C和许许多多的其他边,如何保证C不构成三 ...