我有一堆坐在Web服务后面的业务对象。所有对象都封装在一个BusObjects.DLL中,该对象是强命名的,并位于服务器上的GAC中(因为服务器上的其他应用程序也可以访问它)。
我有一个点击一次的客户端应用程序,它调用了上述的Web服务。该一次性应用程序也附带此BusObjects.DLL。
Web服务将数据返回给客户端的方式如下所示:它将业务对象序列化为一个字节数组并将此字节数组返回给客户端。客户端将接收到的字节数组反序列化为业务对象。这是可能的,因为客户端和服务器代码都有对同一个BusObjects.DLL的引用。这一切都很好。
对我来说问题是这样的。当我有客户端的解决方案(其包括BusObjects项目)在VS2005 IDE,代码无法字节数组反序列化回业务对象,因为它声称,
“无法加载文件或组件 “CC.BusObjects, 版本= 2.12.1.47文化=中性, 公钥= af56fdb58c626305”或 一个及其依赖的位于 集的清单定义并 不匹配组件参考 (从HRESULT异常:。0x80131040 )“
我试过匹配的版本,但是如果BusObjects项目被引用为项目而不是外部程序集,似乎什么都不起作用。不幸的是,我必须在解决方案内部有BusObjects进行调试。
我该怎么办才能解决这个问题?我听说过版本重定向,但似乎无法使它与强大的命名组合工作,但也许我做错了。
这里是序列化和反序列化代码:
public static byte[] ToBinary(Object objToBinary)
{
MemoryStream memStream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter(null,
new StreamingContext(StreamingContextStates.Clone));
formatter.Serialize(memStream, objToBinary);
memStream.Seek(0, SeekOrigin.Begin);
return memStream.ToArray();
}
public static object BinaryTo(byte[] objFromBinary)
{
MemoryStream ms = new MemoryStream(objFromBinary);
BinaryFormatter formatter = new BinaryFormatter();
ms.Position = 0;
object obj = formatter.Deserialize(ms);
return obj;
}
要序列:
[WebMethod]
public byte [] GetContacts()
{
return ToBinary(BusObjects.GetContacts());
}
反序列化:
byte [] bts = ContactService.GetContacts();
List<Contact> lstContacts = (List<Contact>) BinaryTo(bts);
你在客户端签署组装呢?那是在你的客户端项目中,如果你去属性 - >签名,你有没有相同的密钥,服务器端用来签署你的程序集? – 2009-06-08 22:26:56
嗯,这是同一个项目,所以是的,它以同样的方式签名。 – AngryHacker 2009-06-08 22:44:00
JP,你最初的预感是正确的。我去问那些做我们所有建造的人......事实证明,他们没有使用我提供的密钥,而是他们自己的密钥,出于安全原因。 – AngryHacker 2009-06-08 23:12:00