1

こんにちは、私はwebHttpEndpointBehaviorSitecore 6 で WCF サービスを利用しており、Glass Mapper を使用してアイテムを読み取ります。Glass Mapper は Castle ライブラリに依存しています。

それはうまくいっていますが、私は契約のようないくつかの方法を持っています:

        [OperationContract]
        [WebInvoke(Method = "POST",BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        List<Shade> GetAllShades(int columns, int rows);

クラスのリストを JSON 形式で返そうとすると、SvcTraceViewer.exe を使用してサービスをデバッグしているときに、次のエラーが見つかりました。

パラメータ :GetFamilyShadesResult をシリアル化しようとしてエラーが発生しました。InnerException メッセージは、「Type 'Castle.Proxies.ShadeProxy' with data contract name 'ShadeProxy: http://schemas.datacontract.org/2004/07/Castle.Proxies ' は想定されていません。DataContractResolver の使用を検討するか、既知の型のリストに静的に認識されていない型を追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加します。詳細については、InnerException を参照してください。

この問題を解決するにはどうすればよいですか? Castle.Proxies.ShadeProxyは Castle の下の動的クラスであり、使用できません KnownTypeAttribute

実際、JSON.net ライブラリを作成して結果を文字列として返すと、すべて正常に動作します。

4

1 に答える 1

4

Glass 経由でロードされた他のクラスにリンクするクラスがあると仮定します。

[SitecoreClass]
public class Shade{

    [SitecoreField]
    public virtual IEnumerable<AnotherClass> SomeField{get;set;}

    [SitecoreChildren]
    public virtual IEnumerable<AnotherClass> Children{get;set;}      
}
[SitecoreClass]
public class AnotherClass{}

クラスの遅延読み込みを可能にするために、Glass は Castle によって生成されたプロキシを使用するため、実行時にクラスが SomeField プロパティに読み込まれると、AnotherClass クラスのサブクラスが実際に取得されます。

これを解決するには、他のクラスを具象型としてロードするようクラスに明示的に指示する必要があります。SitecoreField 属性を更新すると、この問題が修正されます。

[SitecoreClass]
public class Shade{

    [SitecoreField(Setting=SitecoreFieldSettings.DontLazyLoad)]
    public virtual IEnumerable<AnotherClass> SomeField{get;set;}

    [SitecoreChildren(IsLazy=false)]
    public virtual IEnumerable<AnotherClass> Children{get;set;}
}
[SitecoreClass]
public class AnotherClass{}
于 2012-07-31T11:25:25.320 に答える