如何在.NET Core中重定向程序集探测?(ASP.NET Core MVC部署场景)
嘿,针对你这种直接把App文件夹部署到IIS、用AspNetCoreModule托管的.NET Core 2.0 MVC场景,实现程序集探测重定向其实有几种实用的方式,我结合你的部署模式给你拆解清楚:
方法一:使用Runtime配置文件(无代码侵入,推荐)
.NET Core里的程序集重定向可以通过runtimeconfig相关文件来配置,完全不需要修改代码,很适配你的DevOps部署模式:
- 在项目根目录创建一个名为
runtimeconfig.template.json的文件,这个文件会在构建时自动合并到输出目录的[你的应用名称].runtimeconfig.json中(不用担心构建覆盖的问题)。 - 在这个template文件里添加程序集重定向规则,示例如下:
{ "runtimeOptions": { "assemblyBinding": { "dependentAssembly": [ { "assemblyIdentity": { "name": "OldAssembly", "publicKeyToken": "32ab4ba45e0a69a1" }, "bindingRedirect": { "oldVersion": "1.0.0.0-2.0.0.0", "newVersion": "2.1.0.0" } } ] } } }
- 配置说明:
assemblyIdentity:指定你要重定向的目标程序集名称和公钥令牌(如果是强签名程序集的话)bindingRedirect:定义需要重定向的旧版本范围,以及替换的新版本号
因为你已经配置好了AspNetCoreModule加载入口DLL,IIS托管时会自动读取这个runtime配置,重定向规则会直接生效。
方法二:自定义AssemblyLoadContext(灵活适配复杂场景)
如果配置文件的静态规则满足不了你的需求(比如需要根据环境动态调整重定向逻辑),可以通过代码自定义程序集加载上下文来拦截加载请求:
- 首先创建一个自定义的
AssemblyLoadContext类:
using System; using System.IO; using System.Reflection; using System.Runtime.Loader; public class CustomAssemblyLoadContext : AssemblyLoadContext { protected override Assembly Load(AssemblyName assemblyName) { // 针对特定程序集执行重定向逻辑 if (assemblyName.Name.Equals("OldAssembly", StringComparison.OrdinalIgnoreCase)) { // 指定要加载的新版本程序集的路径 string targetAssemblyPath = Path.Combine(AppContext.BaseDirectory, "bin/NewAssembly.dll"); return LoadFromAssemblyPath(targetAssemblyPath); } // 其他程序集使用默认加载逻辑 return Default.LoadFromAssemblyName(assemblyName); } }
- 在Program.cs的入口方法中注册这个自定义上下文:
public static void Main(string[] args) { var customLoadContext = new CustomAssemblyLoadContext(); // 拦截默认加载上下文的解析请求 AssemblyLoadContext.Default.Resolving += (context, assemblyName) => { return customLoadContext.Load(assemblyName); }; CreateWebHostBuilder(args).Build().Run(); }
这种方式可以让你完全掌控程序集加载的逻辑,适合需要动态切换版本的复杂场景。
IIS部署的额外注意事项
- 确保你重定向目标的新版本程序集已经部署到App文件夹的可访问路径下(比如bin目录或者应用根目录)
- 如果程序集是强签名的,一定要保证
assemblyIdentity里的publicKeyToken和实际程序集的令牌完全一致,否则重定向规则不会生效 - .NET Core 2.x版本下,AspNetCoreModule会自动读取runtimeconfig的配置,不需要额外修改IIS站点的设置
内容的提问来源于stack exchange,提问作者mohammad rostami siahgeli
相关产品推荐
相关产品推荐

