2013-12-23 82 views
0

我有一個WCF服務從BizTalk服務器接收消息。服務期望tempuri.org的名稱空間

該真實由BT服務器處理該消息被簡單地從FTP文件夾拾取並送過來的操作在其上定義如下的服務:

[OperationContract(Action="http://www.mysite.com/ConvertAA", 
        Name="AA", IsOneWay=false)] 
void SaveDataFromAA(AA receivedDoc); 

然而當這個消息到達時,我收到一條消息:

反序列化操作「AA」的請求消息體的錯誤。 OperationFormatter遇到無效的消息體。預期會找到名稱爲「AA」且名稱空間爲「http://tempuri.org/」的節點類型「元素」。發現節點類型「元素」名爲「AA」和命名空間'

現在,這是因爲由第三方(我有過這個沒有控制)發送的XML看起來是這樣的:

<?xml version="1.0" standalone="yes"?> 
<AA> 
    <AAData>...</AAData> 
</AA> 

我有他們的架構已經在我的項目中,當我嘗試調用SaveDataFromAA時,我得到上述錯誤。

我試過在我的服務合同上使用一個空白命名空間,但仍然在尋找tempuri.org - 我沒有對它們的xml的控制,所以有辦法我可以攔截它,修改它並相應地處理它?我很樂意包裝它,但我不太確定從哪裏開始。

+0

我敢肯定這是與DataContract不是OperationContract的一個問題。操作合同定義了服務中操作的身份,在這種情況下,您的SaveDataFromAA在您的服務中稱爲操作AA。它不會改變你的AA對象(receivedDoc) – AgustinCoder

回答

0

我敢肯定,你需要修改你的AA級(receivedDoc參數)進行類似於下面的內容:

[DataContract] 
public class AA 
{ 
    [DataMember] 
    public string AAData {get; set;} 
} 

或假設不關你的屬性或類再搭配:

[DataContract(Name="AA")] 
public class SomeOtherName 
{ 
    [DataMember(Name="AAData")] 
    public string SomeOtherProperty {get; set;} 
} 

你可以找到更多信息,包括如何在以下位置設置的名稱空間信息數據的合同:

http://msdn.microsoft.com/en-us/library/ms733127(v=vs.110).aspx

數據合同等價可能是值得檢討詳細

http://msdn.microsoft.com/en-us/library/ms734767(v=vs.110).aspx

+0

我期望你的第一個例子能夠工作,除了你應該把命名空間和DataContract屬性一起使用:'[DataContract(Namespace =「http://www.mysite.com/ConvertAA」 )]'。 'tempuri.org'是默認的。 – Tim

相關問題