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 抛出异常更好。
添加了无参数构造函数,现在可以正常工作了。
这太奇怪了。我有 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 抛出异常更好。
添加了无参数构造函数,现在可以正常工作了。