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 フレームワーク内です。

これを発見したのは、上記のように 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 フォーマッタ/シリアライザを台無しにしているようです。

4

0 に答える 0