我有一堆坐在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