3

Customer単純なプロパティ (Nameなど)だけを持つクラスがある場合、CustomersControllerから派生する を作成ApiControllerし、 URL を使用して Customer オブジェクトを照会できます/api/customers

同様に、Order単純なプロパティ ( DescriptionAmount) を持つクラスがある場合、 を作成OrdersControllerして同じ方法でアクセスできます。

ただし、それに関連付けられているCustomerをリストするクラスにプロパティを追加すると、次のようになります。OrderCustomer

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    // ...
    public virtual ICollection<Order> Orders { get; set; }
}

...次に、を使用してクエリを実行しようとすると/api/customers、500 サーバー エラーが発生します。内にブレークポイントを配置するCustomersControllerと、正しいメソッドが呼び出され、値を返そうとすることがわかります。ただし、フレームワークの根幹のどこかで、それを HTTP 応答に変換できません。

情報をシリアル化しOrdersたり、HTTP 応答用にパッケージ化したりできないようですが、これを実現するために何をする必要があるかわかりません。それとも、WebApi が複雑なオブジェクトを返すように設計されていないという単純なケースですか?


更新:私のコードはここにあります: https ://gist.github.com/43ed2f29f8adfb44cef6


更新 2 : エラーに関する詳細情報:

Server error
The website encountered an error while retrieving http://localhost:1031/api/customers/6.

メンテナンスのために停止しているか、正しく構成されていない可能性があります。いくつかの提案があります: この Web ページを後でリロードします。HTTP エラー 500 (内部サーバー エラー): サーバーが要求を実行しようとしているときに、予期しない状況が発生しました。

Intellitrace ログには次のように表示されます: http://i.imgur.com/iHxJl.png

[Intellitrace ウィンドウでテキストをコピーできないとは信じられません。そのため、実際に画面を印刷して画像をアップロードする必要がありました。これは何年ですか?]


関連: ASP.Net Web API は VS で正しく表示されるが、HTTP500 を与える

4

2 に答える 2

7

問題を引き起こす Entity Framework エンティティを渡しています。データを送受信するには、データ転送オブジェクトが必要です。エンティティをまとめてバインドするため、データをシリアル化することはできません。

于 2012-07-22T22:36:56.043 に答える
3

OK、私自身の質問に答えてくれたことをお詫びします。特に私が受けたすべての助けの後で(tugberkに感謝します)、簡単な(r)解決策がありました。

tugberkが指摘したように、問題は、エンティティフレームワークをコードファーストで使用してPOCOオブジェクトを操作していたことでした。フレームワークがオブジェクトをシリアル化しようとしたとき、POCOオブジェクトだけでなく、EFプロキシクラスをシリアル化していた。

Tugberkは、DTOを使用してデータを送受信することを提案しました(基本的にこの目的のために新しいクラスを作成します)が、POCOクラスは私にとって完全に適切に見え、重複するクラスがあることはあまり乾燥していないように見えるため、私は本当にそれをしたくありませんでした。

次に、( https://stackoverflow.com/a/11386206/98422を介して)コントローラーのDbContextでプロキシ生成をオフにできることを発見しました(以下のように)。これにより、POCOオブジェクトがシリアル化されるのではなくプロキシクラス-したがって、500エラーを回避します。

db.Configuration.ProxyCreationEnabled = false;

これはエラーを回避しましたが、子オブジェクトのデータが含まれていなかったため、これはソリューションの50%にすぎませんでした。(それらはXMLでnilとして通過しました)。これは、私のPOCOクラスがEFを介した遅延読み込み用に設定されているためです。これを回避するには、子オブジェクトを明示的にロードする必要がありました。

return db.Customers.Include("Orders").AsEnumerable();

仕事は終わりました。ありがたいことに、書くコードはそれほど多くありません。

于 2012-07-23T09:34:20.523 に答える