1

你好,我在 Sitecore 6 下有 WCF 服务,webHttpEndpointBehavior我使用 Glass Mapper 读取项目,Glass Mapper 依赖于 Castle 库。

它运行良好,但我有一些使用 Contract 的方法,例如:

        [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' 与数据合同名称 '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 回答