2012-02-02 56 views
2

後反序列化的合同我有一個現有的WCF的Web API應用程序,使用下面的模式註冊路線:無法改變航線登記

RouteTable.Routes.Add(new ServiceRoute("MyService", new WebServiceHostFactory(), typeof(MyServiceImplementation))); 

我最近更新預覽6.我也更新在全球的註冊模式要的.asax使用增強擴展:

routes.SetDefaultHttpConfiguration(new MyServiceConfiguration()); 
routes.MapServiceRoute<MyServiceImplementation>("MyService"); 

我也有我張貼到的請求的方法的合同。

[WebInvoke(UriTemplate = "/MyOperation", Method = "POST")] 
Contact MyOperation(Contact contact); 

...

[DataContract(Name = "Contact")] 
public class Contact : IExtensibleDataObject 
{ 
    [StringLength(50)] 
    [StringNotEmpty] 
    [DataMember(Name = "FirstName", Order = 1)] 
    public string FirstName { get; set; } 

    [DataMember(Name = "LastName", Order = 1)] 
    public string LastName { get; set; } 

    //[StringLength(50)] 
    //[DataMember(Name = "Location", Order = 1)] 
    //public String Location { get; set; } 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

我得到的問題是,當我發佈之前接受的合同,如:

<Contact xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://myservice/schema"> 
    <FirstName>John</FirstName> 
    <LastName>Smith</LastName> 
    <Location i:nil="true" /> 
</Contact> 

我得到以下異常:

服務器在處理請求時遇到錯誤。請參閱 服務 幫助頁面以構建對服務的有效請求。該 異常消息是「的服務操作‘MyOperation’預期 值分配到類型‘聯繫’輸入參數‘接觸’,但 接收類型的值‘HttpRequestMessage`1’。」。有關更多詳細信息,請參閱服務器日誌 。

我發現,如果我刪除的xmlns = 「HTTP://爲MyService /模式」從我的要求,服務接受請求。我現有的api客戶端會使用這個禮物來調用新服務,所以我必須確保這些消息被接受。

據我所知,我使用的WCF Web Api增強(擴展方法)在引擎蓋下使用了不同的類;但我目前有點無知,爲什麼一個人能夠反序列化,另一個卻不能。

乾杯。

回答

2

的WCF的Web API沒有按使用DataContact串行但是XmlSerializer所以你需要使用這些歸因於裝飾你的合同類。嘗試使用Namespace將XmlRootAttribute添加到Contract類。

[XmlRoot(Namespace = "http://myservice/schema")] 
public class Contact 
{ 
    // ... 
} 
+0

這做到了!所以,我已閱讀(http://codebetter.com/glennblock/2011/05/15/using-datacontracts-with-wcf-web-api/),您可以用[DataContractFormat]屬性標記您的合同以獲取它使用DataContractSerializer。任何想法爲什麼這不起作用? – 2012-02-03 15:45:33

+0

他們已經在版本之間進行了大量的剎車變化更改。使用專注於元素的DataContractSerializer確實對REST服務沒有意義。他們仍然使用JSONDataContractSerializer。 – Maurice 2012-02-04 07:58:37