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 フレームワーク内です。
これを発見したのは、上記のように this.Request.CreateResponse を呼び出す独自の CreateResponse メソッドを持つベース API コントローラーがあるためです。次に、いくつかのヘッダーを追加し、応答にログを書き込み、それを返します。
特に興味深いのは、これが私のエンティティ コントローラの 1 つで機能し、この最新のものでは機能しないことです。つまり、一部のエンティティが気に入らないだけです。
実装を次のようにすることで解決できます。
MyBaseApiController.CreateResponse<T>(HttpStatusCode statusCode, T entity)
where T : EntityObject
しかし、それにもかかわらず、それは奇妙です。
アップデート
いくつかの DRY リファクタリングが原因で、以前の修正が壊れています。それを再び機能させる方法がわからないので、行き詰まっています。
データベースからオブジェクトを返すときは問題が発生しないようですが、Put で受け取ったオブジェクトを返すときに問題が発生するようです。
この問題は、独自の HttpResponseMessage を手動で構築し、フォーマッターを設定するときにも発生します。
データを返す前にデータベースからデータを再読み込みする必要があります。うまくいくことを願っています。私の Get は問題ないので、うまくいくはずです。
更新 2
ああ、それは非常識です。EF からオブジェクトを再度取得し、Get ハンドラー/アクションと同じコード行を使用してそれを返しても、失敗します。違いはリクエストにあるはずです.Chromeによって形成されたGETは問題ありません.テストクライアント(JSON)によって形成されたPUTはそれをつまずかせているに違いありません.
更新 3
継承を避けるためにエンティティをフラット化するのに 1 日を費やしましたが、問題は解決しました。継承はノーノーのようです。
更新 4
だから、私が書いたシリアライズ可能なクラスを返す新しい WebAPI サービスがあります。DataContractSerializer を使用してシリアル化できますが、リクエストが XML を受け入れると 500 が返されますが、JSON を受け入れると問題ありません。
更新 5
ITraceWriterを使用すると、次のように終了するスタック トレースを確認できました。
Exception.Source: System.Xml Exception.Message: ''、16 進値 0x05 は無効な文字です。Exception.StackTrace: System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar (Int32 ch、Byte* pDst、Boolean entitize) で
オブジェクト内の一部のバイト配列が、Xml フォーマッタ/シリアライザを台無しにしているようです。