有谁知道更多关于 CreateResponse 这个问题的信息?
public HttpResponseMessage GetProductLine(Guid id)
{ ... // get object etc. //
// This works.
return this.Request.CreateResponse(HttpStatusCode.OK, productLine);
// This causes HTTP 500 Internal Server Error.
return this.Request.CreateResponse(HttpStatusCode.OK, (EntityObject)productLine);
它创建响应,但在返回时出现问题,因此在 Web API 框架内。
我发现了这一点,因为我有一个基本 API 控制器,其中我有自己的 CreateResponse 方法,它按照上面的方法调用 this.Request.CreateResponse,然后添加一些标头并将一些日志记录写入响应并将其返回。
特别有趣的是,这适用于我的一个实体控制器,而不适用于这个最新的 - 即它只是不喜欢某些实体。
我可以通过使我的实现看起来像这样来解决它:
MyBaseApiController.CreateResponse<T>(HttpStatusCode statusCode, T entity)
where T : EntityObject
但无论如何,这很奇怪。
更新
由于一些 DRY 重构,我之前的修复被破坏了。我无法弄清楚如何让它再次工作,所以我被卡住了。
从数据库返回对象时似乎没有出现问题,但是当我返回在 Put 中接收到的对象时。
手动构建我自己的 HttpResponseMessage 并设置格式化程序时也会出现问题。
在返回数据之前,我必须从数据库中重新读取数据,并希望它能正常工作——我的 Get 很好,所以应该可以。
更新 2
哦,这太疯狂了。即使我再次从 EF 获取对象并使用与 Get 处理程序/操作中相同的代码行返回它,它也会失败。现在的区别必须在请求中 - Chrome 形成的 GET 很好,我的测试客户端 (JSON) 形成的 PUT 一定会绊倒它。
更新 3
我花了一天时间整理我的实体以避免任何继承,问题已经消失了。看来,继承是不行的。
更新 4
所以我有一个新的 WebAPI 服务,它返回我编写的可序列化类。虽然可以使用 DataContractSerializer 对其进行序列化,但当我的请求接受 XML 时,我得到一个 500,但当我接受 JSON 时它很好。
更新 5
使用ITraceWriter我设法看到了堆栈跟踪,它的结尾是这样的:
Exception.Source:System.Xml Exception.Message:'',十六进制值 0x05,是无效字符。Exception.StackTrace:在 System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch,Byte* pDst,布尔实体)
看起来对象中的一些字节数组正在与 Xml 格式化程序/序列化程序搞混。