WCF RESTサービスはエンティティの子を返さない

私はdefaultOutgoingResponseFormatがJsonに設定されているRESTテンプレートを使用してWCFサービスを作成しました。その下で、カスタムPOCOエンティティを回すために、Entity FrameworkとObjectContextを使用して単純なエンティティモデルを構築しました。

単一のエンティティを渡すと、システムは正常に動作します。エンティティに子を追加すると、REST応答は空白になります。デバッガでは、エンティティは正しく設定されますが、サービス自体は何も返しません。

したがって、たとえばTrip.Get()メソッドがあります。 WCFコードは次のようになります。

[WebGet(UriTemplate = "{id}", ResponseFormat = WebMessageFormat.Json)]
public Model.Trip Get(string id)
{
    Model.Trip fetchedTrip = null;
    try
    {
        fetchedTrip = Library.Trip.Get(new Guid(id));
    }
    catch (Exception ex)
    {
        Debug.Write(ex.Message);
    }
    return fetchedTrip;
}

Library.Trip.Getは現用版では次のようになります。

public static Model.Trip Get(Guid tripId)
{
    using (Model.POCOTripContext context = new Model.POCOTripContext())
    {
        var tripEntity = context.Trips.FirstOrDefault(c => c.Id == tripId) ?? new Model.Trip();
        return tripEntity;
    }
}

期待される結果が返されます。これは次のようになります。

{"ArrivalDate": "/ Date(1334203200000-0400)/"、 "DepartureDate": "/ Date(1334721600000-0400)/"、 "Id": "d6413d96-fe1f-4b1c-ae7a-3bbf516cdc2f"、 "Name" : "テスト123"、 "写真":null、 "PlacesOfInterest":null、 "WhereTo": "Orlando、FL"}

しかし、子メソッドを追加するようにLibraryメソッドを変更すると、RESTサービスは空白の値を返します。何もない。

public static Model.Trip Get(Guid tripId)
{
    using (Model.POCOTripContext context = new Model.POCOTripContext())
    {
        var tripEntity = context.Trips.Include("PlacesOfInterest").Include("Photos").Include("PlacesOfInterest.PoiAttributes").FirstOrDefault(c => c.Id == tripId) ?? new Model.Trip();
        return tripEntity;
    }
}

returnステートメントのWCFサービスのデバッガーは、エンティティが完全に正しく入力されていることを示します。

私はいくつかの魔法の属性が不足していることを確信しており、これまでにドームを持っている人が私を助けてくれることを期待しています!

4
Trip または Trips ナビゲーションプロパティは PlacesOfInterest にありますか?はいの場合はそれを削除して(テスト用)、もう一度試してみてください。
追加された 著者 Ladislav Mrnka,
そうすることで、他のすべての関係が壊れてしまいます。マイナーな手術をして、あなたに戻ってきてください。
追加された 著者 Bill Sempf,
それはそれをした!私はupvoteの良さであなたをシャワーことができるように答えを作る!
追加された 著者 Bill Sempf,

1 答え

According to your small test with removing back tracking navigation property you have problem with serialization to JSON. Default serialization is not able to track object references so when it starts serializing your Trip it follows navigation property to points of interest and in first of them it finds reference to Trip. Because it doesn't track references it follows the navigation property and serializes trip again (and again follows his navigation properties) => infinite loop.

テストで行ったようにバックトラッキングナビゲーションプロパティを削除するか、シリアライザに参照を追跡するか、そのプロパティをシリアル化から除外する必要があります(JSONの場合、最初のオプションが何をするかわかりません)。あなたはデフォルトのWCFシリアライゼーションを使用していると思います。

  • [DateContract(IsReference = true)] および各シリアライズされたプロパティを [DataMember] 属性でマークして、参照の追跡を開始します。
  • または、 [IgnoreDataMember] 属性でバックトラッキングナビゲーションプロパティをマークして、プロパティをシリアライゼーションから除外します。
6
追加された
記録のために、すべてのナビゲーションプロパティに[IgnoreDataMember]属性を追加することにしました。これは完全に機能します。
追加された 著者 Bill Sempf,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript