2009-07-24 79 views
1

我已經繼承了一個大的管理winforms應用程序,它共享一個'Common'類庫,用於保存帶有Web服務的數據。我遇到的問題是,如果我從Web服務調用返回一個類的已填充實例,那麼它會作爲不同類型出現在客戶端上,而我不能使用其他'Common'項目邏輯來操作。如何在winforms客戶端和web服務之間使用公共類?

這是因爲雖然web服務將返回一個Common.Widget類型的對象,然後它會將該對象包裝起來以通過網絡傳輸它。完成此操作後,我無法將對象轉換回「常用」類型,因爲.Net會引發InvalidCastException。

我已經完成了WCF和DataMember屬性,但是我現在無法將此項目升級到WCF,因爲它非常大,測試服務器是Win2K(對於Win2K,沒有.Net 3+)。

那麼有沒有辦法讓我輕鬆地做到這一點,還是必須將我從Web服務獲得的所有數據都轉換回公共庫中的原始類型?

在此先感謝

瑞安

回答

2

這是應該的方式。

如果代碼現在正在工作,那麼當您返回其中一種類型時,它目前的功能是什麼?它必須翻譯它,這就是ASMX Web服務意圖行爲的方式。

+0

它做了一些相當討厭的所有對象的重新創建,代碼是意大利麪條,你不能看到一個實例是Web服務還是普通的。我現在會手動翻譯集合等,直到我遷移到WCF。 謝謝 – 2009-07-24 17:25:30

0

我希望有比這更好的辦法,但如果你包括公共庫只與您的Web服務,然後定義返回的對象的Web服務你想在兩種環境中使用的類型(例如你的Widget類),然後你可以在你的winforms客戶端中使用Widget類型的對象。我認爲你看到的轉換異常是因爲你在兩個項目中都包含Common庫 - 即使它們命名相同,你的winforms應用程序將它自己的項目中的Common視爲與Web服務中的Common不同。

上面提到的方法(包括僅在Web服務中使用的方法)將允許您在Winforms應用程序中使用Common對象,即使它們不是來自Web服務(即,您可以使用「new 「關鍵字)。

0

問題是,當您的對象通過網絡傳遞時,它們被反序列化爲Web服務代理專用的類。所以即使類的名稱是相同的,它也是一個單獨的類。你會注意到(如果你在Visual Studio中使用F12),webservice中的類沒有「common」項目中所有類的方法。

相關問題