【发布时间】:2016-11-11 01:11:44
【问题描述】:
我正在寻找一种动态生成 Web api 并在运行时添加它们的方法(在自托管服务器初始化之后)。
基本上,这个想法是: 1. 创建一个服务于静态/已经定义的控制器(web apis)的 selfhost owin 服务器 -> 这部分没问题
稍后,我想动态生成一个新控制器并以某种方式将其添加到服务器,以便客户端可以向它发送请求。 -> 有没有办法做到这一点?我知道我可以动态构建一个控制器并将其添加到服务器之前,它被初始化为服务现有的 web api(使用 CustomAssemblyResolver)。
现在可能需要更新现有控制器。我想重新生成现有控制器并更新服务器以使用新定义(可能参数更改、api 名称更改等) 有什么办法吗?我们可以在不停止所有控制器的情况下回收控制器吗? 如果以某种方式可以支持此功能,是否意味着该服务将在一段时间内不可用(直到更新完成)。
理想情况下,它会像 IIS 中托管的 Web 服务一样工作。如果 Web 服务定义在 2 个请求之间发生变化。第一个请求转到旧定义,第二个请求透明地指向新定义。服务没有中断。
有什么想法吗?
提前致谢
【问题讨论】:
-
找到了解决方案。如果其他人正在寻找这个,我需要覆盖 DefaultHttpControllerSelector。这是一篇关于这个主题的非常好的文章:link 所以基本上对于我上面提到的用例,我需要创建一个新的 AppDomain,在其中启动我的服务,并在运行时动态加载我的程序集。我最后需要覆盖 DefaultHttpControllerSelector 来捕获请求。当请求到达时,它就会控制我要使用的控制器。
-
在那里我可以通过加载新程序集等来动态更新控制器。需要注意的主要是每个请求都会执行此操作,因此很容易影响性能和内存。所以我将实现我自己的控制器缓存。
标签: rest web asp.net-web-api owin self-host-webapi