AppDomain CreateInstanceAndUnwrap:类型未标记为可序列化

Posted

技术标签:

【中文标题】AppDomain CreateInstanceAndUnwrap:类型未标记为可序列化【英文标题】:AppDomain CreateInstanceAndUnwrap: Type is not marked as serializable 【发布时间】:2016-02-23 14:05:54 【问题描述】:

全部,

在我创建的新 appdomain 上调用 CreateInstanceAndUnwrap 时出现无法解释的错误。完整的错误文本是:

在程序集中输入“System.Net.Http.HttpRequestMessage” 'System.Net.Http,版本=4.0.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a' 未标记为可序列化。

子 appdomain 是在 Web API 应用程序中创建的,我尝试为其创建代理的类型派生自 MarshalByRefObject。

定义此类型的程序集没有引用 System.Net.Http 或 System.Web - 所以我不清楚为什么 HttpRequestMessage 可序列化性有任何影响。

我的猜测是它试图将一些上下文数据从父 AppDomain 复制到子 AppDomain,但也许这里有人可以阐明发生了什么?

以下是相关代码:

var appDomain = AppDomain.CreateDomain("AName", null, AppDomain.CurrentDomain.SetupInformation);
SomeClient client = appDomain.CreateInstanceAndUnwrap(typeof(SomeClient).Assembly.FullName, typeof(SomeClient).FullName) as SomeClient;

“SomeClient”类型及其父程序集没有任何 web/system.net.http 引用。

【问题讨论】:

请向我们展示行代码,甚至更多行,如果没有更广泛的上下文,很难推断出来 使用 HttpRequestMessage 的代码必须严格运行在 AppDomain 中,您不能通过公共属性或方法参数在您的 MBRO 派生类中公开它。在网络应用程序中应该相当棘手而且价格昂贵。 谢谢 - 添加了示例代码。我并没有尝试跨应用程序域编组 HTTP 请求,事实上这就是我想要避免的。 ***.com/help/mcve 【参考方案1】:

我找到了答案。

问题出在我们自己的自定义日志框架中,该框架通过委托处理程序连接到应用程序中。

在这个日志框架中,另一个开发人员正在操纵调用上下文: https://msdn.microsoft.com/library/w61s16a1(v=vs.100).aspx

在其中存储整个 HTTP 请求。当启动新的 AppDomain 时,它试图传递这个调用上下文,因此出现了序列化错误。

【讨论】:

以上是关于AppDomain CreateInstanceAndUnwrap:类型未标记为可序列化的主要内容,如果未能解决你的问题,请参考以下文章

System.AppDomain类详解

远程处理:从服务器 AppDomain 查找客户端 AppDomain / Assembly

获取对象的 AppDomain

CLR解析AppDomain

受限 AppDomain 中的 C# 类继承自位于主 AppDomain 中的其他类

使用 JointCode.Shuttle 访问任意 AppDomain 的服务