WebAPI控制器分离
来源:互联网 发布:apache spark 修改数据 编辑:程序博客网 时间:2024/06/13 04:34
默认情况下webapi从当前应用程序域加载控制器,我们可以通过继承DefaultAssembliesResolver类来从新配置入口
需要从写GetAssemblies方法,我们把控制器单独拎出到一个类库中,然后编译控制器所在的类库,并将相关的依赖dll(系统dll除外)拿出来,然后
装载这些dll
/// <summary> /// 装载控制器 /// </summary> internal class ControllerResolver : DefaultAssembliesResolver { public override ICollection<Assembly> GetAssemblies() { var apiController = LoadController(); return apiController; } private ICollection<Assembly> LoadController() { // return AppDomain.CurrentDomain.GetAssemblies().ToList<Assembly>(); const string apiPath = "webapi"; //应用程序根目录下的webapi文件夹中存放api文件 const string ctlfile = ".dll"; //加载的pai文件的扩展名须是dll ICollection<Assembly> baseAssemblies = base.GetAssemblies(); var apipath = AppDomain.CurrentDomain.BaseDirectory + string.Format("\\{0}\\", apiPath); if (Directory.Exists(apipath)) { var apifiles = Directory.GetFiles(apipath, "*" + ctlfile) .Where(t => t.ToLower().EndsWith(ctlfile)) //过滤 .ToList(); foreach (var apidll in apifiles) { baseAssemblies.Add(Assembly.LoadFrom(apidll)); } } return baseAssemblies; } }具体的描述注解中有说明,主要是把dll放到app的根目录下的webapi文件夹中,然后加载进去。详细点的可以看大神的文章:
http://www.cnblogs.com/artech/p/custom-assembly-resolver.html
注意,依赖的dll需要一并放入,不然控制器的初始化会失败
//另一种方式处理:
AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs senderArgs) { Assembly executingAssembly = Assembly.GetExecutingAssembly(); //string name = new AssemblyName(executingAssembly.FullName).Name; string str2 = new AssemblyName(senderArgs.Name).Name; string str3 = str2 + ".dll"; using (Stream stream = executingAssembly.GetManifestResourceStream(str3)) { byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, buffer.Length); return Assembly.Load(buffer); } };==========================================分割线【改进】=============================================
private ICollection<Assembly> LoadController() { const string apiPath = "webapi"; //应用程序根目录下的webapi文件夹中存放api文件 const string ctlfile = ".dll"; //加载的pai文件的扩展名须是dll //AppDomain.Unload(...) //AppDomain.CurrentDomain.GetAssemblies() ICollection<Assembly> baseAssemblies = base.GetAssemblies(); var apipath = AppDomain.CurrentDomain.BaseDirectory + string.Format("{0}\\", apiPath); if (Directory.Exists(apipath)) { var apifiles = Directory.GetFiles(apipath, "*" + ctlfile) .Where(t => t.ToLower().EndsWith(ctlfile)) .ToList(); foreach (var apidll in apifiles) { var tempAsm = Assembly.LoadFrom(apidll); //注意此处会有异常 if (baseAssemblies.Any(x => x.FullName == tempAsm.FullName)) { Console.WriteLine(tempAsm.FullName + " 程序集已加载"); continue; } baseAssemblies.Add(tempAsm); } } return baseAssemblies; }
阅读全文
0 0
- WebAPI控制器分离
- ionic---控制器文件分离
- 百思不得其解的WebAPI控制器匹配BUG
- angular模块控制器分离二
- 控制器减负之分离数据源
- 设置路由,让webapi使用格式为xxxApiController的控制器
- webapi 一个控制器,多个函数名之间的调用
- WebAPI
- webApi
- webapi
- WebAPi
- webAPI
- webapi
- WebAPI
- webapi
- WebApi
- WebAPI
- WebApi
- Android stroke 边框线 某一边
- 如何在Vue中插入echarts图表
- AngularJS Directive 隔离 Scope 数据交互
- 业界领先的Word工具Aspose.Words 5月重要更新汇总 | 附下载
- linux文本文件和win文本文件的格式互换
- WebAPI控制器分离
- pic_struct 解释语---
- 开源 | 新增生产环境最佳实践,[云框架]基于Spring Cloud的微服务架构发布v1.5版本
- 抽象类的实例化
- shell读取文件的每一行
- spring单例在高并发下可能出现的错误
- 四平方和
- 评估反向波兰符号
- aSP.NET下次自动登录cokkie