首页 > 解决方案 > Web API.Net 响应类型和序列化

问题描述

对于以下内容:

    public class ClientReturnWrapper<T> : ClientReturnWrapperBase
    {
        public ClientReturnWrapper(T returnData) => ReturnData = returnData;
        public T ReturnData { get; set; }
    }

    public class ClientReturnWrapperBase
    {
        public DateTime Timestamp => DateTime.Now;
        public bool HasErrors => ClientReturnErrors != null;
        public IList<ClientReturnError> ClientReturnErrors { get; set; }
    }

    public class ClientReturnError
    {
        public string ErrorMessage { get; set; }
        public bool ErrorIsFatal { get; set; }
    }

这个:

    public ClientReturnWrapper<int> Test()
    {
        return new ClientReturnWrapper<int>(1);
    }

回报:

    {"ReturnData":1,"Timestamp":"2019-10-02T12:38:50.9493925+01:00","HasErrors":false,"ClientReturnErrors":null}

然而:

    public ClientReturnWrapperBase TestError()
    {
        return new ClientReturnWrapperBase();
    }

回报:

    <ClientReturnWrapperBase xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Shiva.Models">
        <ClientReturnErrors i:nil="true"/>
    </ClientReturnWrapperBase>

这些都是从浏览器调用的,我希望XML两者都可以,但是前者返回JSON,而后者正确返回XML,尽管缺少属性。

这是什么原因造成的?

编辑:为了解决下面的问题,JSON即使在特别请求时也会返回XML,所以我怀疑 XML 序列化程序无法序列化泛型。有解决方法吗?其次,为什么在第二个示例中使用 XML 序列化程序时缺少属性?

标签: .netasp.net-web-api2.net-4.6.1

解决方案


WebAPI 会根据你客户端发送的 Accept 头自动发送 JSON 或 XML,如果你想获取 XML,只需在客户端请求头中添加

Accept:text/html,application/xhtml+xml,application/xml;

推荐阅读