0

MVC4のWebAPIを利用して、Webサービスに単純なAPIを提供しています。[XmlType]モデルで[XmlRoot]、などを使用してルート要素と各エンティティをラップする要素にカスタム名を設定することについてのSOに関するさまざまな投稿を読みました[XmlElement]が、いずれも効果がないようです。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>

使用したいシリアライザーなどの構成を変更していません。

ここで何かが足りないのですか、それとも要素の名前を変更できないのですか?他に取るべきアプローチ、または私が見逃しているいくつかの必要な設定はありますか?

4

1 に答える 1

1

授業だけできないの?

CustomRootName : List<MyViewModel>

CustomRootName のインスタンスを返しますか?


[あなたのコメントへの私の返信は以下に続きます]

はい、それは API を開始したときの私の見解でしたが、ArrayOfMyViewModel は本質的にシリアライザーによって作成された疑似ラッパーであり、リソース リストごとに 1 行のラッパーを作成することは非常に困難でした。API がより複雑になり、より複雑なリスト タイプをサポートする必要がある場合を検討してください。

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

一貫性のあるインターフェースは有益です。私たちが見つけたもう 1 つの利点は、ドキュメントの使用です。xml-doc タグを使用してコードを文書化し、xslt と少しのリフレクションを使用して API ユーザー ガイドを自動生成します。ラッパー クラスがない場合は、xml-doc タグをハングアップするための情報があります。ですから、最初は面倒に見えましたが、すぐに納得しました。

于 2012-08-28T15:08:45.177 に答える