【问题标题】:Custom name on root and entity XML-elements with Web API使用 Web API 在根和实体 XML 元素上自定义名称
【发布时间】:2012-08-28 14:38:00
【问题描述】:

我正在利用 MVC4 中的 Web API 为我的 Web 服务提供一个简单的 API。我已经阅读了关于在模型上使用[XmlType][XmlRoot][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>

我没有对要使用的序列化程序或类似的任何配置进行任何更改。

我在这里遗漏了什么,或者为什么我不能更改元素的名称?是否有其他方法可以采取,或者我缺少一些必要的设置?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-4 asp.net-web-api


    【解决方案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-doc 标记。所以最初看起来很痛苦,但我很快就被说服了。

    【讨论】:

    • 感谢您的回复!当然,这可能会起作用,至少对于根元素而言。然而,它似乎是治标不治本。此外,当我的 API 增长时,总是创建新的包装类会有点难看,只是为了让名称正确。
    • 嗯,这样说,更有意义,谢谢!我会试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2011-07-27
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多