- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试找到一种通过添加新的ApiController(由另一服务下载)在运行时更新Asp.net Web API(.Net Framework 4.5)的方法(而不回收主appdomain)。
我尝试使用Mef并能够在当前appdomain中加载新的ApiController,但是在尝试更新现有插件时我卡住了(程序集已添加到appdomain中,所以我无法添加新的)。
因此,我决定在一个单独的appdomain中加载包含ApiController的插件,并使用MarshalByRefObject从主appdomain中加载它,但事实证明ApiConroller无法序列化。
你知道我该如何序列化吗?
你知道替代品吗?
编辑:
如果对程序集进行了签名,我设法加载了不同版本的程序集(在同一appdomain中),但是它不符合我的要求。
最佳答案
我没有使用MEF(因为与MAF矛盾,因为从头开始实现它的功能同样容易),但是这样,我对裸露的AppDomains有一定的经验。
不看代码很难说很多,但是从您写的内容来看,在我看来您正在混淆某些事情。
正如您可能已经知道并且已经指出的那样,您实际上无法更新已经加载的程序集。加载它的另一个版本(具有不同的签名)意味着您已加载了两个不同的程序集。其中的类型将具有不同的强名称。如果需要,您实际上可以处理。卸载程序集的唯一方法是卸载包含该程序集的appdomain。
我的问题是这句话:
...在单独的appdomain中加载包含ApiController的插件
并使用MarshalByRefObject从主appdomain加载它
类型(类)定义+代码和实例数据是两件事。将程序集加载到appdomain中意味着您正在加载类型定义和代码。当您想跨应用程序域边界传输实例数据时,就会看到序列化。您无法在编写时从其他应用程序域中加载类型定义和代码(实际上可以,但是我怀疑您需要这样做)。为了能够传输实例数据,双方都需要了解要传输的实例的类型定义。在这种情况下,序列化和传输由.net远程运行时管理。
您有两种选择:要么移动所有实例数据并一直对其进行序列化,要么按照您说的那样选择MarshalByObjRef
方式。让我们继续。为了能够使用另一个应用程序域中的实例,您将需要使用激活器在另一个应用程序域中实例化类型(在这种情况下,您不能使用new
运算符),并获得对其的引用。将基于您知道的类型(也可以是接口或基类,不仅是确切的类型)作为代理。在这种情况下,反射受到某种程度的限制,asp.net为弄清远程对象的方法所准备的东西更少了,但是您可以通过适当的接口来帮助它。
因此,假设您在另一个appdomain中创建了控制器的一个实例,并且在其上有一个远程引用,该引用可分配给定义您需要公开给asp.net的所有方法的接口类型。现在,当尝试访问控制器类的成员时,就会看到序列化。每个方法参数和方法返回类型都需要可序列化。但是类本身不是,因为它是一个MashalByObjRef
后代,并且不会被混搭为一个实例。 MashalByObjRef
与将程序集加载到appdomain中的方式无关。
可是等等! MarshalByObjRef
和ApiController
都是抽象类。您想如何从这两者派生实际的控制器类?你不能因此,我认为您不能直接使用其他应用程序域中的apicontrollers。
我可以想象两件事:
1)继续将新签名版本加载到同一程序集中,并自定义路由机制以将请求定向到最新版本(可能仍然无效,但可能仍是一个很好的起点:https://www.strathweb.com/2013/08/customizing-controller-discovery-in-asp-net-web-api/)。
当然,在重新启动时,如果不需要并行具有多个版本,则应仅加载最新版本。
2)建立一个稍微复杂的基础架构:
定义控制器逻辑的接口
创建无版本且无逻辑的apicontroller,但能够创建和卸载应用程序域,将程序集加载到其中,保留对从上面在其中创建接口的实例的引用,并将请求定向到这些实例
请注意,您将无法将某些内容(例如控制器上下文)传递给另一个应用程序域中的逻辑,您将必须提取需要的内容或在另一端重新创建
这样,您可以在“远程”应用程序域中具有逻辑MarshalByObjRef
子代,而在主应用程序域中具有控制器ApiController
子代。
我将创建一个扩展ApiController
的临时抽象类,该类可以自行处理上述分隔。应用程序的其余部分不会意识到这一点。
请注意远程处理中涉及的终生服务,您可以通过使用赞助者或覆盖MarshalByObjRef的某些方法来处理。
都不是简单的方法,您将面临进一步的挑战...
关于c# - Mef:尝试从另一个应用程序域加载ApiController时,“无法序列化”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50081508/
说真的,你怎么能在不发疯的情况下处理所有这些异常呢?我是不是读了太多关于异常处理的文章或什么?我尝试重构了几次,但每次似乎都以更糟糕的结果告终。也许我应该承认确实会发生异常(exception)情况,
背景 两者 try/rescue和 try/catch是 Elixir 中的错误处理技术。根据 corresponding chapter在介绍指南中。 Errors can be rescued u
每当我尝试在 Raspberry PI 上运行此 python 脚本时,我都会遇到问题: import socket import sys # Create a TCP/IP socket sock
我想知道一些关于 PHP 的 try , catch声明。 让我们考虑以下示例。 abstract class ExceptionA extends Exception {} class Except
我的 laravel v5.4 项目中有两个模型,user 和 admin。 在 config/auth.php 中,我向守卫和提供者添加了管理员,如下所示: 'guards' => [ 'w
try: r = requests.get(url, params={'s': thing}) except requests.ConnectionError, e: print e
我有以下代码。 但是,它并不能捕获所有错误,而我仍然会收到“throw er;//未处理的'错误'事件”。 为什么是这样? app.post('/api/properties/zip/:zip/bed
问题与细节 我正在使用自定义错误处理,遇到的错误之一是“路径中的非法字符”。我有一个自定义函数,旨在通过路径字符串查找此类非法字符,并在找到它们时引发自定义错误。但是我发现,取决于非法字符,Test-
This question already has answers here: How do I catch a numpy warning like it's an exception (not j
我正在使用其他人的代码,但我不熟悉try/catch,因此我举了一个类似的小例子。在第11行上,如果我写了error(''),似乎没有发现错误并增加了索引j。但是,编写error(' ')或error
我在我的一个程序中遇到了这个问题,在这种情况下,尝试/异常(exception)的错误使程序变得更好,以防用户意外输入了他们不应该输入的内容。它仍然给我错误,我为为什么感到困惑。如果对我的问题确实很重
我在尝试TRY ... CATCH块时遇到问题。有人可以解释为什么以下代码无法执行我的sp吗? DECLARE @Result int SET @Result = 0 BEGIN TRY SE
我有一个相当大的 powershell 脚本,其中包含许多(20 多个)执行各种操作的函数。 现在所有代码实际上都没有任何错误处理或重试功能。如果某个特定的任务/功能失败,它就会失败并继续。 我想改进
为什么我尝试时需要导入 inputmismatchException catch(InputMismatchException e){ System.out.println("
我对此感到困惑 - 我为辅助方法编写了一个 try/catch 。它的目的是捕获任何无效输入(任何不是“男性”或“女性”的内容(没有特定情况)。如果输入无效,它将通知用户,然后让他们重试。如果有效,则
我有时会发现自己处于如下场景。尽可能简单地陈述问题 “有时我会创建一段代码,Java 让我将其包含在 try/catch 语句中。我没有使用 catch,所以我将其留空。为什么这是错误的?” boo
我有点困惑为什么当我不使用 Try block 时会出现 Try block 错误。 我在代码块底部附近收到错误通知。如果我不使用 try/catch,有人可以向我解释为什么会发生这种情况吗? 它是否
我已经盯着我的电脑两个小时了,我不知道我做错了什么。谁能帮助我看到光明? package blackjack; import java.util.Random; import java.util.Sc
我想将方法保存在 Enum 中,但 Class.getDeclaredMethod 抛出 NoSuchMethodException,那么我该如何处理呢?我的代码: public enum Car
这个问题已经有答案了: Executing multi-line statements in the one-line command-line (18 个回答) 已关闭 3 年前。 如何使用try.
我是一名优秀的程序员,十分优秀!