【发布时间】:2017-02-21 08:39:58
【问题描述】:
Servicecontract 和 OperationContract 如下所示:
[ServiceContract]
public interface IAssemblyResolver
{
[OperationContract]
Assembly LoadAssembly(AssemblyLoadRequest loadRequest);
// TODO: Add your service operations here
}
在返回类型 Assembly 时,我在跟踪日志中得到以下错误:
尝试序列化参数http://tempuri.org/:LoadAssemblyResult 时出错。 InnerException 消息是 'Type 'System.Reflection.RuntimeAssembly' 与数据协定名称 'RuntimeAssembly:http://schemas.datacontract.org/2004/07/System.Reflection' 不是预期的。如果您使用 DataContractSerializer 或将任何静态未知的类型添加到已知类型列表中,请考虑使用 DataContractResolver - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给序列化程序的已知类型列表中。有关详细信息,请参阅 InnerException。
在客户端我得到以下错误:
附加信息:接收对http://localhost:8769/AssemblyResolverService.svc 的HTTP 响应时出错。这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。
【问题讨论】:
-
是否要返回 dll 二进制文件?
-
请解释您要做什么。这听起来好像行不通。如果您希望 WCF 服务为客户端托管 DLL,则需要将 DLL 及其依赖项流式传输到客户端。
-
我想从共享位置加载一个程序集并简单地返回它。
-
是的,那部分很清楚。但这行不通。 Assembly 实例与它加载的 AppDomain 相关联,即您的服务在其中运行的 AppDomain。您的客户端具有不同的 AppDomain。你这样做是为了解决什么问题?
-
我们有一些服务器进程正在运行,它取决于我们在运行时决定的某些 dll,并且要加载这些 dll,我们需要使用可以提供程序集的服务。首先,如果不可用,我们尝试在本地加载它,然后我们将使用这个服务来放置这个处理程序。 AppDomain.CurrentDomain.AssemblyResolve += resolver.LoadAssembly;这现在有意义吗?