Wcf 如何在使用svcutils生成代理时保留一些自定义属性?

Wcf 如何在使用svcutils生成代理时保留一些自定义属性?,wcf,proxy,protobuf-net,Wcf,Proxy,Protobuf Net,我使用以下命令为WCF服务生成代理类: svcutil.exe" /out:C:\SomePath\.... /n:*,Internal.FooNameSpace http://localhost/MyService.svc 以下类别: [ProtoContract] [ServiceContract] public class Foo { [ProtoMember(1)] [DataMember(Order = 0)] public string Bar {

我使用以下命令为WCF服务生成代理类:

svcutil.exe" /out:C:\SomePath\.... /n:*,Internal.FooNameSpace 
   http://localhost/MyService.svc
以下类别:

[ProtoContract]
[ServiceContract]
public class Foo 
{
    [ProtoMember(1)]
    [DataMember(Order = 0)]
    public string Bar { get; set; }
}
变成:

public partial class Foo : object, System.Runtime.Serialization.IExtensibleDataObject
{            
        private string BarField;

        [System.Runtime.Serialization.DataMemberAttribute()]
        public string Bar
        {
            get
            {
                return this.BarField;
            }
            set
            {
                this.BarField = value;
            }
        }        
}

有没有办法在生成的类上保留一些特定的属性?(例如:
ProtoMember
,在本例中)。我当然可以破解代理,但它会造成维护问题。

如果您将其作为服务引用添加,则不可以:无法保留该信息-它根本不在WCF端点中

但是IIRC,当您有多个属性时,WCF代码生成器实际上会产生增量的
顺序
值,即下一个属性是
[System.Runtime.Serialization.DataMemberAttribute(Order=1)]
,然后是
2
等。因此,一个选项是在不同的文件中(部分类的美),定义(在同一名称空间中等)有关您的类型的附加信息:

[ProtoContract(DataMemberOffset = 1)]
public partial class Foo { }
这意味着:在处理
[DataMember]
时,将
1
添加到每个值-这意味着您应该获得所需的1,2,3,4…并且一切都会很好,并且您不必更改代码

或者,您可以显式地:

[ProtoContract]
[ProtoPartialMember(1, nameof(Foo.Bar))]
[ProtoPartialMember(2, nameof(Foo.AnotherProp))]
public partial class Foo { }
这使您可以更灵活地指定属性的细微差别

另一种选择是,您可以在运行时配置所有内容:

RuntimeTypeModel.Default.Add(typeof(Foo), false)
    .Add(1, nameof(Foo.Bar))
    .Add(2, nameof(Foo.AnotherProp));
    // or AddField to get the ValueMember that you can use to set
    // fine-grained control
最后,您可以发送数据契约dll,并告诉svctil使用它已经包含的类型。您可以使用
/reference:
命令行开关来执行此操作,或者在使用UI工具时有一个类似的功能(允许您从可用dll中进行选择)



作为第二个“最终”(因为一个还不够):您可以将数据描述为.proto模式,只需告诉收件人在本地执行codegen并告诉svcutil将其排除(
/excludeType:
/reference:
)。请注意,当前不包括
[DataContract]
[DataMember]
属性,但如果有用的话,我今天可以添加它。

你是对的,这不完全是生成的。我在匿名代理时犯了一些错误。我编辑了问题。我可能需要另一杯咖啡。谢谢你的回答,我正在阅读。即将添加另一个选项…关于使用
DataMemberOff的解决方案set
:我不得不用
[DataContract]
属性来修饰部分类以使其工作。仅使用
[ServiceContract]
它不工作(序列化程序返回一个空字节数组)@tigrou就足够了;我假设(似乎是错误的)
Foo
已经被标记为
[DataContract]