最近在给一个老项目做数据对接接口。

背景一

该项目最后更新日期为2006年,使用ASP.NET WebForm、.Net2.0、OJB、Castle Avtive Record等。由于是某集团的子系统之一,所以在获取人员信息时,必须使用已经封装好的组件。

背景二

接口对面是一个JAVA项目,一般这种老系统我都建议使用SOAP服务做对接,要是用Restful服务就得再新起一个接口项目专门做JAVA对接,然后再用老系统与接口项目对接,麻烦。结果同事去谈需求的时候压根没注意老项目的年代,一上去就奔着Restful服务去了,聊完以后人家两天就把代码写完了,我们这边懵逼了。让对方改代码也不现实,毕竟一开始是我们考虑欠妥。最后决定,把老项目升级到.Net4.0,直接使用WebAPI。

正文

升级过程非常顺利,编译也没有任何错误。运行一下,功能也都没有任何问题,心里一阵窃喜。那就到正式环境部署一版.Net4.0的跑跑吧,毕竟正式环境还是Windows Server 2003+IIS6.0。部署完毕以后启动后台登录页一看,傻眼了。

一开始以为是服务器配置的问题,结果把发布文件部署在本地也是同样的异常。很明显,这种异常只会出现在发布后的项目里。从调用栈里可以获取到一些信息,但是还是太少。想要调试发布的代码,可以使用VS自带的远程调试工具。

远程调试步骤就不多说,网上有很多例子。调试过程中会遇到无法命中断点的情况。

这种情况有可能是你要调试的项目没有载入断点符号,载入符号的具体步骤如下:

1.打开调试里的模块窗口。

2.找到项目的dll,右键点击加载符号,就能命中断点了。

通过调试发布以后的项目,发现有一处参数传值不正确。正常情况下,参数key的值应该是GetObjectByID,而这里竟然将构造函数传进来了。显然“未将对象引用设置到对象的实例”是由这个key造成的。

沿着调用栈继续往上找,发现一段这样的代码,根据调用栈获取调用函数的名称。也就是说,问题可能出现在skipStack上了。

随后,我将发布前和发布后的调用栈信息输出出来对比(左边是发布前,右边是发布后)。

从输出里可以看到,发布前比发布后多了一步函数调用(因为.Net2.0还不支持参数默认值,所以通过这种方式实现默认参数的效果)。

引起调用栈不一致的原因可能是在Release时,多出的一步调用被编译器优化掉了(我将VS的运行模式换成Release以后异常也能重现)。至于以前为什么没出现这样的问题,可能是当时的编译器优化能力没现在这么强吧,06年那会儿应该是VS2005。

至此,本次抓臭虫的任务圆满完成。

记一次"未将对象引用设置到对象的实例"问题的排查过程的更多相关文章

  1. SQL Sever无法打开链接对话框,未将对象引用设置到对象的实例。(AppIDPackage)

    前几天刚做完系统,先装的是SQL Sever2008,装完后还试了一下,OK~没问题,然后就继续装VS2012等一些软件.搞到很晚没有继续试试就睡了,第二天运行SSMS出问题了..(如图 1.0 所示 ...

  2. WPF中未将对象引用设置到对象的实例

    前几天,我开始了WPF的基础学习,一上来我就遇到了一个令我头痛的问题,按照书上的例子我写了一段属于自己的代码,一个简单的色调器.满心期待的编译运行,就出现了未将对象引用设置到对象的实例.我在网上查阅了 ...

  3. c#:未将对象引用设置到对象的实例--可能出现的问题总结(转)

    1.c#:未将对象引用设置到对象的实例--可能出现的问题总结(转):http://www.cnblogs.com/KeenLeung/archive/2013/06/23/3150578.html

  4. IIS报错 未将对象引用设置到对象的实例。

    在vs中运行正常的项目 ,发布到IIS总是提示 未将对象引用设置到对象的实例. 运行静态页面 html正常,只是打开.aspx页面的时候报错,在确保了数据库,配置,权限均正常的情况下. 错误原因:先安 ...

  5. 解决使用DevExpress开发错误:未将对象引用设置到对象的实例

    在使用DevExpress是总是会出现一些状况.这次同事在他的机器上调试完成的代码发过来,却出现"未将对象引用设置到对象的实例"的错误,提示是Resources.resx的问题.另 ...

  6. asp.net 中Session的运用,及抛出错误“未将对象引用设置到对象的实例”

    1. 页面载入后,必须要等到page_Load方法执行建立 page对象后才可以使用Session 2. 在.aspx和.cs文件中使用Session的区别 (1).aspx: Session[&qu ...

  7. 2014-08-26 解决HttpContext.Current.Session在ashx文件中出现“未将对象引用设置到对象的实例”的问题

    今天是在吾索实习的第35天. 最近在使用HttpContext.Current.Session来获取Session["..."]的值时,常常会弹出错误——“未将对象引用设置到对象的 ...

  8. 一般处理程序中使用Session出现未将对象引用设置到对象的实例

    遇到问题:未将对象引用设置到对象的实例 那就在你的一般处理程序中加入红色背景的代码吧 using System; using System.Collections.Generic; using Sys ...

  9. 解决:getWeatherbyCityName(city),服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。

    原文:getWeatherbyCityName(city),服务器无法处理请求. ---> 未将对象引用设置到对象的实例. 解决方法:不要直接使用 “服务引用” , 添加为 “Web 引用” 最 ...

随机推荐

  1. SPFA(Shortest Path Faster Algorithm)

    特别说明 本文转载自三金(frinemore)的博客: 点这 前言 1.关于SPFA,它没死. 2.接下来的所有代码,都是自己手写的(未检查正确性,补充的代码有检查过,是对的),有错误请帮忙指出. S ...

  2. Python笔记(八)

    #-*-coding:utf-8-*- # Python内置函数 print abs(-45) # 绝对值函数 print divmod(7,2) # 返回一个包含商和余数的元组 # input(&q ...

  3. Spark SQL概念学习系列之分布式SQL引擎

    不多说,直接上干货! parkSQL作为分布式查询引擎:两种方式 除了在Spark程序里使用Spark SQL,我们也可以把Spark SQL当作一个分布式查询引擎来使用,有以下两种使用方式: 1.T ...

  4. Oracle 复合索引设计原理——前缀性和可选性

    前缀性: 复合索引的前缀性是指只有当复合索引的第一个字段出现在SQL语句的谓词条件中时,该索引才会被用到.如复合索引为(ename,job,mgr),只要谓词条件中出现第一个字段ename,就可以用复 ...

  5. 深度理解DOM事件(实例)

    前言 通过如下两个实例来理解DOM事件 实例1--点击别处关闭浮层 onclick与addEventListener的区别 实例2--点击后颜色一层一个层出现的漂亮的彩虹圈 1  实例1--点击别处关 ...

  6. MySQL中的存储函数和存储过程的简单示例

    存储函数 定义 CREATE FUNCTION `fn_sum`(`a` int,`b` int) RETURNS int(11) BEGIN RETURN a + b; END 调用 Navicat ...

  7. ES6的基本语法

    ES6 详细参考页面 简介 ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现.一般来说,这两个词是可以互换的. let命令 ES6新增了let命令,用来声明变 ...

  8. reflect 反射结合集合泛型的总结

    集合泛型: 可以放任何对象的 ArrayList  ArrayList list = new ArrayList();  没有限定泛型类型. list.add("lilin");l ...

  9. canvas 画图优化

    http://www.cnblogs.com/rhcad/archive/2012/11/17/2774794.html

  10. Laravel 5.5 项目安装报错

    错误一. [Composer\Exception\NoSslException] The openssl extension is required for SSL/TLS protection bu ...