【问题标题】:How to return type "Assembly" in WCF?如何在 WCF 中返回类型“程序集”?
【发布时间】: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;这现在有意义吗?

标签: c# wcf


【解决方案1】:

您需要使用Assembly.FullName 手动将Assembly 序列化为字符串并返回它。要将字符串反序列化为 Assembly,请使用 Assembly.Load method

服务器示例:

string LoadAssembly(AssemblyLoadRequest loadRequest)
{
    return ....Assembly.FullName;
}

在客户端使用:

Assembly.Load(LoadAssembly(....));

如果您需要将程序集序列化为文件(如果它在客户端不存在),您可以试试这个:

服务器示例:

byte[] LoadAssembly(AssemblyLoadRequest loadRequest)
{
    return File.ReadAllBytes(....Assembly.Location);
}

在客户端使用:

var assembly = Assembly.Load(LoadAssembly(....));

但是如果你从字节数组加载程序集,你需要使用反射来处理这个程序集中的类型。

【讨论】:

  • 我认为最好只返回 byte[] 并在客户端简单地执行 Assembly.Load(bytes);
  • 程序集不必存在于客户端上。通过发送其 FullName,您不会“序列化”程序集。
  • 我更新了我的回复,为了完整的汇编序列化。
  • @Ivan Kishchenko/@CodeCaster:出于好奇,创建 WEB Api 而不是 WCF 服务会更好。根据我的理解,我们应该使用 WEB Api,我们有一个资源的概念,如订单、客户等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2013-03-24
  • 2017-09-13
  • 2017-01-12
相关资源
最近更新 更多