服务合同& 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请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。
答案 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(....));
但是如果从字节数组加载程序集,则需要使用反射来处理此程序集中的类型。