ASP.NET Web API2,一个路由 returns JSON 无论接受设置如何

ASP.NET Web API2, one route returns JSON regardless of Accept setting

这太奇怪了。我有 3 种类型的工作,每一种都有自己开始工作的路线和获得结果的路线。但是 return 生成的对象的代码对于所有三种类型的作业都是相同的。

对于两种工作类型 "conn.setRequestProperty("接受", "application/xml");"工作正常。我有一个客户端将其设置为 JSON 并得到 JSON,另一个将其设置为 XML 并得到 XML。但是对于第三种工作类型,它总是返回 JSON.

控制器:

[Route("v1/reports/{guid}")]
[Route("v2/document/{guid}")]
[HttpGet]
public IHttpActionResult Get(string guid)
{
    IHttpActionResult result = CheckForReport(guid, RepositoryStatus.REQUEST_TYPE.DocGen, true);
    if (Log.IsDebugEnabled)
        Log.Debug($"Document Get({guid}) = {result}");
    return result;
}

代码returning:

protected IHttpActionResult CheckForReport(string guid, RepositoryStatus.REQUEST_TYPE requestType, bool returnReport)
{
        switch (reportStatus.RequestType)
        {
            // returns JSON or XML
            case RepositoryStatus.REQUEST_TYPE.TagTree:
                return Ok(Repository.GetTagTree(guid));
            // returns JSON or XML
            case RepositoryStatus.REQUEST_TYPE.Metrics:
                return Ok(Repository.GetMetrics(guid));
            // returns JSON regardless of Accept setting
            case RepositoryStatus.REQUEST_TYPE.DocGen:
                return Ok(Repository.GetReport(guid));
            default:
                return NotFound();
        }
}

被return编辑的对象:

Document GetReport(string guid);

对象本身:

[DataContract]
public class Document
{
    /// <summary>
    /// The unique identifier for this request.
    /// </summary>
    [DataMember]
    public string Guid { get; set; }
    [DataMember]
    public byte[][] Pages { get; set; }
}

Document 对象的唯一不同之处在于它有一个成员 "byte[][]"。

那么为什么要强制 JSON return?

找到了。在 returned class 中有另一个 class 的成员对象。 class 没有无参数构造函数。 JSON 序列化程序处理得很好。 XML 没有,显然在那种情况下 ASP.NET 比 return JSON 抛出异常更好。

添加了无参数构造函数,现在可以正常工作了。