1

有谁知道更多关于 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 格式化程序/序列化程序搞混。

4

0 回答 0