Wcf 如何在使用svcutils生成代理时保留一些自定义属性?
我使用以下命令为WCF服务生成代理类: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 {
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]