如何在WCF中返回“Assembly”类型?

时间:2017-02-21 08:39:58

标签: c# wcf

服务合同& 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请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。

1 个答案:

答案 0 :(得分:0)

您需要使用Assembly.FullName手动将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(....));

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