今天在开发过程中遇到了一个很恶心的问题,就是form窗体showdialog的时候,直接报出下面的错误:
将断点加在helpdisplayeditorform_load函数上发现,根本进不到函数内部,就报错了。
个人认为是form窗体在showdialog函数之后,helpdisplayeditorform_load函数之前发生的异常,于是上网搜资料,看微软的源码,也没什么收获。
于是,咨询了一下同事,同事说把helpdisplayeditorform_load中的所有代码屏蔽掉,看看效果。
我把helpdisplayeditorform_load内所有代码屏蔽到以后,断点可以进入helpdisplayeditorform_load函数内部了,然后,一部分一部分代码的放开,发现,只要到需要调用服务端方法的时候,就会报出上面的错误(所有调用wcf服务端方法的地方都会报错)。
更新过错误提示的dll(通过dll反编译发现错误提示的函数在dll中是存在的),重启过iis等等n过方法之后,还有木有搞定。
由于,是所有wcf服务端方法均不可用,于是回头研究wcf客户端,发现wcf客户端有问题,有人在获取wcf服务端方法的时候,wcf将服务契约标识方法入参中的自定义类型、返回值是自定义类型的,均隐式进行了实体类序列化(此处的序列化指的是,将自定义类型的实体,标识成了wcf数据契约的类型)。
比如spi中的实体类如下:
标识序列化之后的类的为:
该标识序列化之后的类在是reference.cs文件中找到的。
解决方案:
将reference.cs文件所有标识序列化的类、枚举,全部删除,改为引用spi中的实体类、枚举,然后,重新生成wcfclient,部署,问题搞定。
今天的收获:
1、断点没有进入函数(helpdisplayeditorform_load),并不表示问题,一定在函数之外。
2、数据契约中knowntypeattribute属性,在同一个类上标识很多次,如下图: