三步快速解决dll冲突问题
最近在推广应用我们的分布式服务网关(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, 类似的错误还有: ?未能加载文件或程序集“***.dll”或它的某一个依赖项 运行时如何快速定位到dll 冲突的根本原因,找到到底加载的dll是在GAC中、还是Bin中、还是指定目录中的dll? 有经验的老司机,分享给大家一个三步法,屡试不爽!!! 1. 找到程序主进程,右键:Create Dump File,如果IIS站点:指定应用程序池下的w3wp进程,如果自己的服务进程,直接找进程即可 2. 安装指定版本的Windbg(X86X64),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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 我可以确定HttpModules是按照HttpApplication.M
- asp.net-mvc – ASP.NET MVC MultiSelectList,其中所选值未
- asp.net – 分布式事务完成 可以在新事务或NULL事务中登录此
- asp.net-mvc – 我为什么要在LINQ To SQL存储库保存方法中使
- ASP.NET“死亡黄屏”如何显示代码?
- asp.net-mvc-3 – 局部变量在Razor助手中不起作用
- System.Net.ServicePointManager.DefaultConnectionLimit和
- ASP.NET Core 认证与授权[2]:Cookie认证
- asp.net – ELMAH登录SQL Server
- 为什么我不能在我的代码asp.net c#中使用app_code中的代码文
- .net4.0中的ClientIDMode
- 在ASP.NET MVC C#中使用Jquery更新部分视图
- asp.net-mvc – ASP.NET MVC – HtmlHelper和Ses
- asp.net – 在浏览器关闭并重新打开后维护相同的
- 将ASP.NET引入Thinking Request是Ajax请求jQuery
- asp.net – 如何为多行TextBox设置maxlength?
- asp.net-core – app.UseErrorHandler()可以访问
- 在asp.net上单击按钮的空文本框的Javascript验证
- asp.net – ELMAH是否默认实施并启用了防洪功能?
- asp.net – 从另一个域配置IIS身份验证