新建一个类库:

SelfHost:

方法一:

1.添加对MyControllers类库的引用.

2.在控制台代码中加入一行代码:

当然,可以添加多个程序集.(记得引用)

  1. var config = new HttpSelfHostConfiguration("http://localhost:9527");
  2. config.Routes.MapHttpRoute(
  3. "API Default",
  4. "api/{controller}/{action}/{id}",
  5. new { id = RouteParameter.Optional });
  6.  
  7. //加载外部程序集
  8. Assembly.Load("MyControllers");
  9.  
  10. using (var server = new HttpSelfHostServer(config))
  11. {
  12. server.OpenAsync().Wait();
  13. Console.WriteLine("请开始您的表演");
  14. Console.ReadLine();
  15. }

3.测试结果:

方法二:

1.新建自定义的 AssembliesResolver 类

  1.  

2.修改控制台代码:

  1. var config = new HttpSelfHostConfiguration("http://localhost:9527");
  2. config.Routes.MapHttpRoute(
  3. "API Default",
  4. "api/{controller}/{action}/{id}",
  5. new { id = RouteParameter.Optional });
  6.  
  7. //加载外部程序集
  8. //Assembly.Load("MyControllers");
  9. //Assembly.Load("TestControllers");
  10.  
  11. config.Services.Replace(typeof(IAssembliesResolver), new MyAssembiesResolver());
  12.  
  13. using (var server = new HttpSelfHostServer(config))
  14. {
  15. server.OpenAsync().Wait();
  16. Console.WriteLine("请开始您的表演");
  17. Console.ReadLine();
  18. }

实际上就添了一行代码...

3.测试:

上面的方法将程序集写死在代码里,这肯定不符合要求.

方法三:

新建3个类,如下:

  1. public class AppConfigSetting
  2. {
  3. public static string AssembliesLoadFrom => GetValue();
  4.  
  5. public static string GetValue([CallerMemberName]string key = null)
  6. {
  7. return System.Configuration.ConfigurationManager.AppSettings[key];
  8. }
  9. }
  1. public class AssembliesLoad : ConfigurationSection
  2. {
  3.  
  4. [ConfigurationProperty("", IsDefaultCollection = true)]
  5. public AssemblyElementCollection AssemblyNames
  6. {
  7. get { return (AssemblyElementCollection)this[""]; }
  8. }
  9.  
  10. public static AssembliesLoad GetSection()
  11. {
  12. return ConfigurationManager.GetSection(AppConfigSetting.AssembliesLoadFrom) as AssembliesLoad;
  13. }
  14. }
  15. public class AssemblyElementCollection : ConfigurationElementCollection
  16. {
  17. protected override ConfigurationElement CreateNewElement()
  18. {
  19. return new AssemblyElement();
  20. }
  21. protected override object GetElementKey(ConfigurationElement element)
  22. {
  23. AssemblyElement serviceTypeElement = (AssemblyElement)element;
  24. return serviceTypeElement.AssemblyName;
  25. }
  26. }
  27.  
  28. public class AssemblyElement : ConfigurationElement
  29. {
  30. [ConfigurationProperty("assemblyName", IsRequired = true)]
  31. public string AssemblyName
  32. {
  33. get { return (string)this["assemblyName"]; }
  34. set { this["assemblyName"] = value; }
  35. }
  36. }
  1. public class WebApiResolver : DefaultAssembliesResolver
  2. {
  3. public override ICollection<Assembly> GetAssemblies()
  4. {
  5. AssembliesLoad settings = AssembliesLoad.GetSection();
  6. if (null != settings)
  7. {
  8. try
  9. {
  10. foreach (AssemblyElement element in settings.AssemblyNames)
  11. {
  12. AssemblyName assemblyName = AssemblyName.GetAssemblyName(element.AssemblyName);
  13. if (!AppDomain.CurrentDomain.GetAssemblies().Any(assembly => AssemblyName.ReferenceMatchesDefinition(assembly.GetName(), assemblyName)))
  14. {
  15. AppDomain.CurrentDomain.Load(assemblyName);
  16. }
  17. }
  18. }
  19. catch (Exception e)
  20. {
  21.  
  22. }
  23. }
  24. return base.GetAssemblies();
  25. }
  26. }

修改配置文件:

  1. <configuration>
  2. <configSections>
  3. <section name="test1" type="SelfHost.AssembliesLoad,SelfHost"/>
  4. <section name="test2" type="SelfHost.AssembliesLoad,SelfHost"/>
  5. </configSections>
  6.  
  7. <appSettings>
  8. <add key="AssembliesLoadFrom" value="test1"/>
  9. </appSettings>
  10.  
  11. <test1>
  12. <add assemblyName="MyControllers.dll" />
  13. <add assemblyName="TestControllers.dll" />
  14. </test1>
  15.  
  16. <test2>
  17. <add assemblyName="Wjire.Controllers.dll" />
  18. </test2>
  19.  
  20. <startup>
  21. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  22. </startup>
  23. </configuration>

修改控制台代码:

测试结果就不贴了.

OwinSelfHost:

目前不知道怎么使用配置文件的方式,因为只要添加了程序集的引用,Owin就能找到里面的控制器,

就算采用上面的方法三也没有什么用,还是全部都能访问到

额外:

1.如果不同的程序集中有相同名字的控制器,那么会报错

WebApi 的三种寄宿方式 (二) - 宿主和控制器不在一个程序集的更多相关文章

  1. WebApi 的三种寄宿方式 (一)

    最近逛博客园,看到了Owin,学习了一下,做个笔记,说不定将来哪天就用上了 关于 Owin 的介绍,百度解释的很清楚了: https://baike.baidu.com/item/owin/28607 ...

  2. linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用

    ---操作环境--- 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 物理机系统版本:win10  一.虚拟网络三种连接方式 当在V ...

  3. Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)

    勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...

  4. WCF开发框架形成之旅---WCF的几种寄宿方式

    WCF开发框架形成之旅---WCF的几种寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者 ...

  5. Linux基石【第二篇】虚拟网络三种连接方式(转载)

    在虚拟机上安装完Centos系统后,开始配置静态IP,以方便在本宿主机上可以访问虚拟机,在曲折的配置中,了解到虚拟机还有三种连接方式:Bridged,NAT和Host-only,于是,我又一轮新的各种 ...

  6. 通过三个DEMO学会SignalR的三种实现方式

    一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...

  7. Hive metastore三种配置方式

    http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...

  8. Map三种遍历方式

    Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...

  9. (转)WCF开发框架形成之旅---WCF的几种寄宿方式

    WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...

随机推荐

  1. [Leetcode] String to integer atoi 字符串转换成整数

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  2. BZOJ2460 [BeiJing2011]元素 【线性基】

    2460: [BeiJing2011]元素 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1675  Solved: 869 [Submit][St ...

  3. 收藏一个漂亮的Flash焦点图切换

    网上闲逛的时候发现一个Flash焦点图效果,跟喜欢,然后就下载回来,收集在这里,以便以后方便取用.这个Flash使用方法也是相当简单的,如果你喜欢,也可以从这里查看源代码下载. Flash 焦点图效果 ...

  4. 浏览器 连不上网 (3):DNS 服务器问题

    解决:设置一下DNS服务器的地址 步骤: 打开网络和共享中心(网络和 Internet设置)-> 更改适配器 -> 双击我们连接的 无线网(WiFi式) 或 以太网(网线式): 从出现的窗 ...

  5. bzoj 1576: [Usaco2009 Jan]安全路经Travel——并查集+dijkstra

    Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数 ...

  6. 【BZOJ】1708: [Usaco2007 Oct]Money奶牛的硬币

    [算法]DP [题解] 如果每个排列算一种,则令f[i]表示凑成面值为i的方案数,容易推出f[i]+=f[i-a[j]]. 现在是每个组合才算一种,令f[i][j]第二维表示只使用前j种面值,f[i] ...

  7. 【洛谷 P1363】幻想迷宫(搜索)

    这题其实可以很简单. 题目叫做"幻想迷宫",那么我们就幻想一个迷宫. 借用一下@FancyDreams的图片 只有左上角第一个\(5*4\)的迷宫是真的, 其他都是我们幻想出来的. ...

  8. spin_lock浅析【转】

    转自:http://blog.csdn.net/frankyzhangc/article/details/6569475 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天我们详细了解一下sp ...

  9. Ubuntu服务器安装node

    查看Ubuntu系统的是32位还是64位 harvey@harvey:/Application$ uname -m #x86_64表示这是64位的系统 x86_64   2.  在nodejs官网ht ...

  10. python类的__new__和__init__

    python的类,和其他语言有一点不太一样,就是,他把新建一个类和初始化一个类,分成了两个方法: __new__ __init__ 当然,想想就知道,肯定是__new__先发生,然后才是__init_ ...