最近在推广应用我们的分布式服务网关(Web Api):业务组大部分对外的业务逻辑以HSF服务或者自定义扩展插件的方式,注册并发布到分布式服务网关中,统一对外提供WebApi服务。临时介绍下我们的分布式服务网关:

1. 一键注册、发布WebApi服务,

2. 统一管理发布WebApi服务,实现WebApi的服务化治理

3. 集成安全认证、加解密、监控、日志等Aspect

4. 流量安全控制:流控

5. 横向伸缩、弹性扩展,支持大规模并发

6. 简化WebApi开发,提升开发效率,减少重复开发工作

在实际的开发应用中,业务逻辑dll要注册、发布到分布式服务网关中,例如参数类型、自定义扩展插件等。

每次业务的变更,都需要重新发布服务,例如实体类的注解(属性标签)发生变化,重新发布服务,分布式服务网关侦测到变化,重新加载。

同时,各个业务模块之间存在SPI层接口、实体类的依赖,例如:A中依赖B.Spi.dll, B发布了最新的B.Spi.dll, A未发布,这样会产生一个问题:

一个AppDomain中只能加载一个B.Spi.dll,如果先访问A服务,那么旧版本的B.Spi.dll就会先加载到AppDomain,此时,访问B服务时,就会出现dll冲突问题:

例如:

{"ErrorInfo":"数据序列化错误:程序集“***.Module.CarMdelAnalyse.SPI, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=null”中的类型“***.Module.CarMdelAnalyse.SPI.CarModelAnalyseResult”未标记为可序列化。r\rn
在 System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)\r\n
在 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)\r\n
在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()\r\n
在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector,
StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter,
SerializationBinder binder)\r\n 在 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo,
NameInfo memberNameInfo, NameInfo typeNameInfo)\r\n 在 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph,
Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)\r\n
在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers,
Boolean fCheck)\r\n 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)\r\n

类似的错误还有:

未能加载文件或程序集“***.dll”或它的某一个依赖项

运行时如何快速定位到dll 冲突的根本原因,找到到底加载的dll是在GAC中、还是Bin中、还是指定目录中的dll?

有经验的老司机,分享给大家一个三步法,屡试不爽!!!

1. 找到程序主进程,右键:Create Dump File,如果IIS站点:指定应用程序池下的w3wp进程,如果自己的服务进程,直接找进程即可

2. 安装指定版本的Windbg(X86\X64), Ctrl+D 加载第一步抓的Dump文件,.loadby sos clr  -> !dumpdomain

3. 找到相关的dll文件路径,ILSpy,反编译定位问题,解决。

show:

1. 抓dump:通过上面的错误堆栈,我们定位到w3wp.exe,  右键创建转储文件

2. 安装Windbg, 请根据程序的32/64版本下载安装不同的Windbg,我们用的64位,因此用的Windbg是X64版本的。打开windbg,Ctrl+D, 加载刚才抓的dump文件

依次输入命令:.loadby sos clr  -> !dumpdomain

得到domain信息输出:

以ServiceStack.Redis.dll这个dll为例,可以找到在哪个路径下加载的dll:类似的找业务相关的dll即可:

3. 找到AppDomain加载的dll,拷贝,ILSpy:

windbg的确在内存镜像分析时是一个利器,赞一个!

周国庆

2017/4/23

三步快速解决dll冲突问题的更多相关文章

  1. 只需三步 快速完善网站Sitemap

    越来越多的SEOer把优化的重点放在了站内优化上,细心的朋友应该查看一些前辈的robots.txt的时候不难发现,他们的robots中都加 入了一句Sitemap: http://www.dewang ...

  2. 10分钟系列:NetCore3.1+EFCore三步快速完成数据库交互

    前言 做程序开发,不管是什么语言什么数据库,其中的ORM(对象关系映射)是必不可少的,但是不管选择哪一种ORM,都需要了解其中的运行机制,配置帮助类等等. 所以很多ORM都开始进行升级封装,我们只需要 ...

  3. C#通过外部别名,解决DLL冲突问题

    今天遇到一个有两个DLL文件,命名空间,部分类名与部分方法名一样,但是方法的功能实现不一样.调用方法时,无法调用指定DLL的指定方法.在网上找了好多,简单总结一下. 1.首先添加引用,不细说. 2.右 ...

  4. 7步快速解决SQLServer数据库(2008版)重装问题

    最近遇到了鼠标双击启动不了数据库的问题,根据事件管理器和自己的最近的使用情况初步判断估计是自己在用360误伤了数据库(哭) 没有办法只好重新安装一下了,参考了网上的一些大神们的教程然后自己实战操作一下 ...

  5. Cache系列:spring-cache简单三步快速应用ehcache3.x-jcache缓存(spring4.x)

    前言:本项目基于spring4.x构建,使用ehcache3.5.2和JCache(jsr107规范) 一.依赖 除了ehcache和cache-api外,注意引用spring-context-sup ...

  6. spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发

    前言: 基于spring framework 4.x或spring boot 1.x开发环境 务必注意以下版本问题:Spring framework4.x(Spring boot1.x)对应sprin ...

  7. 简单三步快速学会使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件(postgre使用实例)

    前言: mybatis-generator是根据配置文件中我们配置的数据库连接参数自动连接到数据库并根据对应的数据库表自动的生成与之对应mapper映射(比如增删改查,选择性增删改查等等简单语句)文件 ...

  8. iOS开发- 三步快速集成社交化分享工具ShareSDK

    1.前言 作为现在App里必不可少的用户分享需要,社交化分享显然是我们开发app里较为常用的. 最近因为公司App有社交化分享的需要,就特此研究了会,拿出来与大家分享. 想要集成社交会分享,我们可以使 ...

  9. 在WINDOWS下 三步快速配置 eclipse c++ 环境

    所需软件 1.Eclipse IDE for C/C++ Developers http://www.eclipse.org/downloads/packages/eclipse-ide-cc-dev ...

随机推荐

  1. 求助,如何干掉这个不要脸的“流氓”

      问题 chrome 第一次打开时,被一个加"7654 导航"的网站捆绑. 查看设置中启动页中,被设置如下:   解决   域名查看,阿里竟然为这样的网站搞隐私保护   尝试 安 ...

  2. Android -- 仿小红书欢迎界面

    1,觉得小红书的欢迎界面感觉很漂亮,就像来学习学习一下来实现类似于这种效果  原效果图如下: 2,根据效果我们来一点点分析 第一步:首先看一下我们的主界面布局文件视图效果如下: main_activi ...

  3. C#与Java区别(一)

    最近学了点java,总结了一些和c#的语法区别,欢迎大家指点和补充,如下: 1.java支持跨平台,当然.net core现在也支持. 2.java中用package,c#中用namespace定义空 ...

  4. background-size IE8兼容方案

    根据canius(http://caniuse.com/#search=background-size),background-size兼容性为IE9以及以上浏览器,如下图所示. 实例代码: < ...

  5. Win10上编译CoreCLR的Windows和Linux版本

    一.编译环境 首先,不管是Windows还是Linux版本CoreCLR的编译,都是在Windows10上进行的. 二.CoreCLR for Windows 在Windows上做编译怎么能少得了Vi ...

  6. 【转】SQL Server海量数据库的索引、查询优化及分页算法

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  7. 一个请求中,ADF、JSF究竟做了哪些工作

    在Oracle ADF开发中,一个请求发生后,经过ADF处理后,我们可以很快得到响应页面,但在请求过程中ADF框架在背后究竟做了什么东西呢?今天让我们一起来了解下,ADF.JSF是基于组件模型的,不同 ...

  8. 《C++之那些年踩过的坑(三)》

    C++之那些年踩过的坑(三) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. [版权声明]转载请注明原文来自:h ...

  9. SUSE linux 使用LVM安装系统和管理

    引出 在我们安装好linux系统后会发现在需要修改磁盘分区的时候会比较困难,系统安装的/目录的文件系统要更改基本不太可能,其他目录如/home目录也比较困难.但是系统安装时要是采用的LVM管理的方式安 ...

  10. 20155205 2016-2017-2 《Java程序设计》第4周学习总结

    20155205 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 private成员会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(若 ...