WebApi 的三种寄宿方式 (二) - 宿主和控制器不在一个程序集
新建一个类库:

SelfHost:
方法一:
1.添加对MyControllers类库的引用.
2.在控制台代码中加入一行代码:

当然,可以添加多个程序集.(记得引用)
var config = new HttpSelfHostConfiguration("http://localhost:9527");
config.Routes.MapHttpRoute(
"API Default",
"api/{controller}/{action}/{id}",
new { id = RouteParameter.Optional });
//加载外部程序集
Assembly.Load("MyControllers");
using (var server = new HttpSelfHostServer(config))
{
server.OpenAsync().Wait();
Console.WriteLine("请开始您的表演");
Console.ReadLine();
}
3.测试结果:

方法二:
1.新建自定义的 AssembliesResolver 类

2.修改控制台代码:

var config = new HttpSelfHostConfiguration("http://localhost:9527");
config.Routes.MapHttpRoute(
"API Default",
"api/{controller}/{action}/{id}",
new { id = RouteParameter.Optional });
//加载外部程序集
//Assembly.Load("MyControllers");
//Assembly.Load("TestControllers");
config.Services.Replace(typeof(IAssembliesResolver), new MyAssembiesResolver());
using (var server = new HttpSelfHostServer(config))
{
server.OpenAsync().Wait();
Console.WriteLine("请开始您的表演");
Console.ReadLine();
}
实际上就添了一行代码...
3.测试:

上面的方法将程序集写死在代码里,这肯定不符合要求.
方法三:
新建3个类,如下:
public class AppConfigSetting
{
public static string AssembliesLoadFrom => GetValue(); public static string GetValue([CallerMemberName]string key = null)
{
return System.Configuration.ConfigurationManager.AppSettings[key];
}
}
public class AssembliesLoad : ConfigurationSection
{ [ConfigurationProperty("", IsDefaultCollection = true)]
public AssemblyElementCollection AssemblyNames
{
get { return (AssemblyElementCollection)this[""]; }
} public static AssembliesLoad GetSection()
{
return ConfigurationManager.GetSection(AppConfigSetting.AssembliesLoadFrom) as AssembliesLoad;
}
}
public class AssemblyElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new AssemblyElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
AssemblyElement serviceTypeElement = (AssemblyElement)element;
return serviceTypeElement.AssemblyName;
}
} public class AssemblyElement : ConfigurationElement
{
[ConfigurationProperty("assemblyName", IsRequired = true)]
public string AssemblyName
{
get { return (string)this["assemblyName"]; }
set { this["assemblyName"] = value; }
}
}
public class WebApiResolver : DefaultAssembliesResolver
{
public override ICollection<Assembly> GetAssemblies()
{
AssembliesLoad settings = AssembliesLoad.GetSection();
if (null != settings)
{
try
{
foreach (AssemblyElement element in settings.AssemblyNames)
{
AssemblyName assemblyName = AssemblyName.GetAssemblyName(element.AssemblyName);
if (!AppDomain.CurrentDomain.GetAssemblies().Any(assembly => AssemblyName.ReferenceMatchesDefinition(assembly.GetName(), assemblyName)))
{
AppDomain.CurrentDomain.Load(assemblyName);
}
}
}
catch (Exception e)
{ }
}
return base.GetAssemblies();
}
}
修改配置文件:
<configuration>
<configSections>
<section name="test1" type="SelfHost.AssembliesLoad,SelfHost"/>
<section name="test2" type="SelfHost.AssembliesLoad,SelfHost"/>
</configSections> <appSettings>
<add key="AssembliesLoadFrom" value="test1"/>
</appSettings> <test1>
<add assemblyName="MyControllers.dll" />
<add assemblyName="TestControllers.dll" />
</test1> <test2>
<add assemblyName="Wjire.Controllers.dll" />
</test2> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
修改控制台代码:

测试结果就不贴了.
OwinSelfHost:
目前不知道怎么使用配置文件的方式,因为只要添加了程序集的引用,Owin就能找到里面的控制器,
就算采用上面的方法三也没有什么用,还是全部都能访问到
额外:
1.如果不同的程序集中有相同名字的控制器,那么会报错

WebApi 的三种寄宿方式 (二) - 宿主和控制器不在一个程序集的更多相关文章
- WebApi 的三种寄宿方式 (一)
最近逛博客园,看到了Owin,学习了一下,做个笔记,说不定将来哪天就用上了 关于 Owin 的介绍,百度解释的很清楚了: https://baike.baidu.com/item/owin/28607 ...
- linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用
---操作环境--- 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 物理机系统版本:win10 一.虚拟网络三种连接方式 当在V ...
- Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)
勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...
- WCF开发框架形成之旅---WCF的几种寄宿方式
WCF开发框架形成之旅---WCF的几种寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者 ...
- Linux基石【第二篇】虚拟网络三种连接方式(转载)
在虚拟机上安装完Centos系统后,开始配置静态IP,以方便在本宿主机上可以访问虚拟机,在曲折的配置中,了解到虚拟机还有三种连接方式:Bridged,NAT和Host-only,于是,我又一轮新的各种 ...
- 通过三个DEMO学会SignalR的三种实现方式
一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...
- Hive metastore三种配置方式
http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...
- Map三种遍历方式
Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...
- (转)WCF开发框架形成之旅---WCF的几种寄宿方式
WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...
随机推荐
- Cube 找规律
这道题我们经过简单的推测便可得知3个之前特判,四个之后就成为了一般状况,就是我们每侧都是走整个整个的|_|之后零的走|||. 考试的时候包括平时做题,许多正确的感性比理性证明要强得多. #includ ...
- BZOJ2631 tree(伍一鸣) LCT 秘制标记
这个题一看就是裸地LCT嘛,但是我wa了好几遍,这秘制标记...... 注意事项:I.*对+有贡献 II.先下传*再下传+(因为我们已经维护了+,不能再让*对+产生贡献)III.维护+用到size # ...
- [hdu 6069]素数筛+区间质因数分解
给[L,R]区间的每一个数都质因数分解的复杂度可以达到(R-L)logR,真的涨姿势…… 另外,质因数分解有很重要的一点,就是只需要打sqrt(R)以内的素数表就够了……因为超过sqrt(R)的至多只 ...
- SICAU-OJ: 三角关系
三角关系 题意: 给出两个数n和k,统计(a,b,c)三元组满足(a+b)%k=0,(b+c)%k=0,(a+c)%k=0且1<=a,b,c<=n的数量. 题解: 由(a+b)%k=0,( ...
- MFC 对话框透明效果
网上找的资料自己改了改,在这里记录和分享一下,主要是TransparentWnd函数. 在子类的OnShowWindow函数中调用 ShowWindowAlpha() #pragma once tem ...
- Spring MVC 参数校验
转自:http://blog.csdn.net/eson_15/article/details/51725470 这一篇博文主要总结一下springmvc中对数据的校验.在实际中,通常使用较多是前端的 ...
- 【Foreign】红与蓝 [暴力]
红与蓝 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input 2 2 0 1 -1 -1 2 0 ...
- [object-c 2.0 程序设计]object-c file handle (二)
// // main.m // cmdTry // // Created by Calos Chen on 2017/8/21. // Copyright © 2017年 Calos Chen. Al ...
- mobius反演讲解
mobius反演的基本形式为,假设知道函数F(x)=Σf(d) d|x,那么我们可以推出f(x)=Σmiu(d)*F(x/d) d|x,另一基本形式为假设知道函数F(x)=Σf(d) x|d,那么我们 ...
- Emmet 也有快速生成文件头的功能
输入下边加粗的缩写,然后Tab,就OK了http://docs.emmet.io/cheat-sheet/ html:4t <!DOCTYPE HTML PUBLIC "-//W3C/ ...