2012-08-28 64 views
0

我正在利用MVC4中的Web API爲我的Web服務提供一個簡單的API。我已經閱讀了關於在模型上使用[XmlType],[XmlRoot],等在SO上的各種帖子來設置自定義名稱的根元素和元素包裝每個實體,但沒有一個似乎有任何效果。這個API在整體上運行良好,但是XML屬性似乎沒有效果,給我留下了不相關的元素名稱。使用Web API的根和實體XML元素的自定義名稱

我已經簡化我的代碼一些,以使這個例子更清楚,但是這基本上是什麼樣子:

API控制器:

public class SomeController : ApiController 
{ 
    [HttpGet] 
    public List<MyViewModel> All() 
    { 
     return ApiProvider.All() 
         .Select(v => new MyViewModel 
         { 
          SomeId = v.SomeId 
          SomeValue = v.SomeValue 
         }).ToList(); 
    } 
} 

MyViewModel:

public class MyViewModel 
{ 
    public int SomeId { get; set; } 
    public int SomeValue { get; set; } 
} 

當前XML響應:

<ArrayOfMyViewModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://schemas.datacontract.org/2004/07/..."> 
    <MyViewModel> 
     <SomeId>3</SomeId> 
     <SomeValue>My value</SomeValue> 
    </MyViewModel> 
</ArrayOfMyViewModel> 

期望中的XML響應:

<CustomRootName xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns="http://schemas.datacontract.org/2004/07/..."> 
    <CustomEntityName> 
     <SomeId>3</SomeId> 
     <SomeValue>My value</SomeValue> 
    </CustomEntityName> 
</CustomRootName> 

我並沒有配置更改想什麼串行我使用,或類似的東西。

我在這裏錯過了什麼,或者爲什麼我不能更改元素的名稱?是否還有其他方法需要採取,或者我缺少一些必要的設置?

回答

1

你就不能有一類

CustomRootName : List<MyViewModel> 

,並返回CustomRootName的實例?


[我對您的評論的答覆如下說明]

是的,這是我的觀點,當我們開始了我們的API,但ArrayOfMyViewModel基本上是由串行器創建一個假的包裝和創建每個資源一行包裝名單是那麼多的一個綁定。考慮當您的API變得更復雜,你需要支持更復雜的列表類型,即:

<CustomRootName > 
    <RootType>typeB</RootType> 
    <CustomEntityName> 
     <SomeId>3</SomeId> 
     <SomeValue>My value</SomeValue> 
    </CustomEntityName> 
    <CustomEntityName> 
...etc 
    </CustomEntityName> 
</CustomRootName> 

你會從一個統一的界面中受益。我們發現的另一個好處是有文件。我們使用xml-doc標籤記錄我們的代碼,然後使用xslt和一些反射自動生成api用戶指南。如果你沒有包裝類,那麼有知道懸掛XML文檔標籤。所以最初看起來像一個痛苦,但我很快就相信了。

+0

感謝您的回覆!當然,這可能會起作用,至少對於根源而言。但是,它似乎可以治癒症狀而不是實際問題。另外,當我的API增長時,創建新的包裝類將會有點難以理解,只是爲了獲得正確的名稱。 –

+0

好吧,就這樣放,這樣更有意義,謝謝!我會試一試。 –

相關問題