我沒有使用肥皂標題,所以我希望這裏有一個答案。這是我想要完成的一個簡單例子。ASMX使用編譯的類型而不是SoapHeader的生成類型
我有一個ASMX Web服務和一個客戶端,以及一個共享的DLL。在shared.dll中,我有一個可序列化的類型,我們稱它爲CustomHeader,從SoapHeader派生。有接受這是通過SOAPHEADER屬性輸入一個Web方法,所以我的服務看起來像:
[WebService]
public class MyService : WebService {
public CustomHeader MyCustomHeader { get; set; }
[WebMethod]
[SoapHeader("MyCustomHeader", Direction = SoapHeaderDirection.In)]
public void Go() { }
}
到目前爲止,一切都很好。在Go()方法內部,我可以訪問MyCustomHeader對象並使用它。從客戶端生成代理時,生成的代碼包括一個CustomHeader類,該類包含MyService對象的數據屬性以及一個名爲CustomHeaderValue的屬性,我可以在對Go()進行服務調用之前在客戶端上設置該屬性,以及它通過它很好。
問題是原始的CustomHeader類有幫助填充數據字段(哈希函數,計算值等)的構造函數和方法。由於客戶端具有對共享庫的引用,客戶端可以創建原始CustomHeader類的實例,但不能在服務調用中使用該對象,因爲它在技術上是不同的類型。
我能想到的處理這幾種方法:
1)在同一時間超過一個拉動性轉換的CustomHeader對象生成的CustomHeader類。這不會有太多的處理,但這意味着我需要使用反射來遍歷屬性,或者在CustomHeader類更改時觸摸轉換代碼。
2)序列化CustomHeader對象,然後將其反序列化到生成的CustomHeader類中 - 因爲除了構造函數和方法外,它們真的是相同的,所以序列化應該很好。這將是最簡單的方法,但它需要額外的一輪序列化/反序列化,雖然不是非常昂貴,但仍然是額外的處理。
3)修改生成的代碼,使我的共享類型的CustomHeaderValue屬性,而不是生成的類型。我認爲這是一種可怕的做事方式,但它可能是這些選項中最便宜的方式。我不打算做這個選擇,但我只是想把它放在那裏,因爲從技術上講它會起作用。
我錯過了什麼嗎?有沒有一個可以接受的模式?
感謝您的幫助。
謝謝。我感覺如果沒有升級到WCF或者執行上面列出的解決方案之一,我不會做到這一點。我將使用上面的#2解決方案,序列化和反序列化對象,將其轉換爲適當的類型。 – 2010-12-07 00:12:48