2011-06-07 51 views
0

我正在將WSE3 Web服務移動到WCF。但客戶端是WSE3客戶端。使用MessageContract屬性時出現問題:異常 - >名稱空間'End'元素'Body''http://schemas.xmlsoap.org/soap/envelope/'期望

所有操作合同都會返回MessageContract類的實例。這適用於2個操作,但對於同一個服務合同的一個操作,某種程度上失敗。錯誤是:

The signature or decryption was invalid.

當我看着WCF跟蹤文件中,我發現了以下內容:

The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'MyOperationName'. End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'MyOperationName' from namespace 'urn:MyProject:MyModule:2006:04:MyAuthorizationModule'. 

我的觀察是,當我使用XmlRoot屬性來裝點響應級(而不是使用MessageContract屬性),我沒有得到這個例外。但是,響應對象不能被反序列化。即我可以在輸入跟蹤中看到XML響應,但由於預期的XML結構不匹配,服務調用在客戶端返回null

MessageContract類只有一個返回其被飾以XmlRoot屬性的另一個類的實例公開屬性(MessageBodyMember)。這個類(用xmlRoot裝飾)有一個屬性,它給出了Collection某個實體類的對象,它具有XmlElement屬性。

我需要檢查/驗證哪些東西? 如果需要,我可以提供課程代碼片段。

回答

0

在響應中使用的MessageContract沒有問題。問題出在OperationContract的輸入參數上。

當我查看舊的WSE3 Web服務代理方法(WebMethod)並在WCF服務中爲它創建了OperationContract時,我創建的OparationContract未接受任何參數。

在調查此問題時,我使用svcutil.exe從舊WSE3服務的WSDL創建.NET類。當我查看具體的OperationContract時,我開始知道我需要創建一個MessageContract,它將用作OperationContract的請求參數。所以我創建了MessageContract而沒有任何MessageBodyMember。當我使用它時,問題解決了。

顯然,如果我們將OperationContract簽名與ASMX WebMethod簽名進行比較,它們不匹配,因爲我們引入了輸入參數。但是,這工作。我不知道如何以及爲什麼。 如果有人解釋它爲什麼會起作用,那將會很棒。

相關問題