【问题标题】:Hiding derived class in WCF在 WCF 中隐藏派生类
【发布时间】:2013-09-13 20:58:10
【问题描述】:

我想在我的 WCF 服务中对客户端隐藏派生类。

例子-

[DataContract]
public class Base
{
    public int Id {get; set;}
}

public class Derived : Base
{         
    public string Name {get; set;}
}

假设我有类似的运营合同

[OperationalContract]
Base GetData();

运营合同的实施

public Base GetData()
{
    Derived = new Derived {Id = 1, Name = "Foo" };
    return derived;
}

上面的例子不起作用。如果我在 Base 类中添加 [KnownType(typeof(Derived)] 并将 DataContract 属性添加到 Derived 类,那么一切似乎都正常。但是如果我这样做,客户端将看到我想隐藏的 Derived 类。是可以对客户隐藏 Derived 类吗?谢谢

【问题讨论】:

  • 在返回之前投到 Base 是否有效?或者您可以将其映射到基础(手动或自动创建一个新基础并复制数据)。
  • 它抛出“尝试序列化参数tempuri.org/:DerivedResult时出错”。第二个建议是我想避免的黑客攻击。
  • 从技术上讲,如果您要分离数据合同和实体,允许您解耦并将 WCF 转换为实现细节,这不仅不是黑客但它也是免费提供给你的。您将在多种实体类型和一种数据协定类型之间进行映射。

标签: c# wcf


【解决方案1】:

我想你会得到你想要使用命名 DataContracts 而不是添加 KnownType 属性的黑客等效行为,如下所示:

[DataContract(Name="Reply")]
public class Base
{
    [DataMember]
    public virtual int IntValue { get; set; }

}

[DataContract(Name = "Reply")]
public class Derived : Base
{

    public String StringProperty { get; set; }
}



Derived blah = new Derived { IntValue = 3, StringProperty = "blah" };
public Base SomeOperation()
{
     return blah;
}

这是你想要的吗?还可以看看 DataContractSurrogates (http://blogs.msdn.com/b/carlosfigueira/archive/2011/09/14/wcf-extensibility-serialization-surrogates.aspx),它被告知 WCF 支持 zimdanen 所说的一种奇特方式 - 为您的 API 创建一个类型,并以一种不那么“hacky”的方式将您的内部类型转换为这个 API 类型.

【讨论】:

  • 希望我可以 +1 两次,每个答案一次。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2010-11-27
  • 2023-03-28
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2021-11-04
相关资源
最近更新 更多