【问题标题】:WCF - any way to mark an attribute as ignored?WCF - 任何将属性标记为已忽略的方法?
【发布时间】:2011-09-05 16:17:16
【问题描述】:

如果我有以下情况:

[DataContract]
public class Foo
{
    [MyCustomAttribute(...)]
    [DataMember(IsRequired = true)]
    public int bar { get; set; }
}

我怎样才能让MyCustomAttribute在用户使用“添加服务引用...”生成类时被忽略

基本上,我不希望在客户端生成代码的属性上设置该属性。请记住,我仍然希望属性本身显示出来,但基本上客户端应该是这样的......

[DataContract]
public class Foo
{
    [DataMember(IsRequired = true)]
    public int bar { get; set; }
}

【问题讨论】:

  • 这应该是“添加服务引用”代理生成器的默认行为。您是否尝试过添加服务引用并获得自定义属性?
  • 我没有尝试,我查看了Reference.cs文件,发现它携带了诸如DataMember(IsRequired = true)之类的项目,并认为它携带了属性。我猜那个属性是重建的,而不是继承的。

标签: c# wcf attributes service-reference


【解决方案1】:

没有办法将您的属性包含在客户端生成的代码中

参考:http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/ce241118-bc79-4788-a739-c445a52fcd1d

【讨论】:

    【解决方案2】:

    [DataMember] 是序列化引擎的一部分,因此需要。您在代理中看到它的原因是代理使用与服务相同的DataContractSerializer。当 IsRequired 设置为true 时,代理可以确定是否可以发送客户端(如果设置了所需的值)。

    从 WSDL 可以确定是否需要一个属性,所以 DataMemberAttribute 是基于 WSDL 文件设置的;不是服务的源代码。默认情况下,代理完全由网络上可用的服务描述生成。正如其他答案所提到的,您肯定会不会将自己的自定义属性复制到代理中。

    【讨论】:

      【解决方案3】:

      一种可能性是创建一个接口并将属性放置在接口方法上。

      您可以查询接口而不是具体类,但 WCF 只会看到该类的具体实现。

      你可以说:

       [DataContract] 
       public class Foo : IFoo
       {
           [DataMember(IsRequired = true)]
           public int bar { get; set; } 
       }
      
       public interface IFoo 
       {
           [MyCustomAttribute(...)]
           int bar { get; set; } 
       }
      

      【讨论】:

        猜你喜欢
        • 2017-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-08
        • 1970-01-01
        • 2011-10-18
        • 2020-11-26
        相关资源
        最近更新 更多