为什么WCF有时会在生成的代理类型的末尾添加"Field"?

tav*_*rph 17 c# wcf asmx

基本上,我有一个服务器端类型"Foo",成员X和Y.每当我使用Visual Studio的"添加服务器参考"时,我看到WSDL和生成的代理都向所有成员附加单词"Field"并更改第一个字母的外壳.IE,"X"和"Y"被重命名为"xField"和"yField".知道为什么会这样吗?我无法弄清楚这种模式.

详细信息 - 我有一个传统的ASMX Web服务,它公开了一个"Foo"类型.我创建了一个新的WCF服务,它是旧Web服务的包装器 - 新服务只包装这些方法并可能更新几个字段的值,但它公开了完全相同的方法并返回完全相同的类型.我曾多次尝试重新创建referenes,每次都会重命名我的字段:变量"STUFF"在wsdl和proxy中显示为"sTUFFField".变量"X"显示为"xField"等.

有趣的是我无法弄清楚模式 - 我尝试创建一个新的ASMX Web服务作为测试和包装 - 变量不会被重命名.所以我无法弄清楚为什么/何时WCF重命名变量的模式.

有人知道吗?

tgr*_*fin 25

我有同样的问题,而sergiosp的回答让我朝着正确的方向前进.只需添加一些额外的信息,希望能帮助别人.

添加[System.ServiceModel.XmlSerializerFormatAttribute()]到界面,并重新生成客户端代码解决了我的问题.

public interface IMyService
{
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    [System.ServiceModel.OperationContract]
    recordResponse GetRecord(recordRequest request);

}
Run Code Online (Sandbox Code Playgroud)


mar*_*c_s 3

通常,生成的代理将“XField”和“YField”作为内部/受保护/私有字段,并通过称为“X”和“Y”的属性公开这些值。我认为,您可以在创建代理客户端时设置一些选项,以根据您的喜好进行调整。

更新:我似乎没有找到任何开关或选项来控制这种行为。它可能取决于 WCF 用于创建客户端代理的序列化程序(DataContractSerializer 与 XmlSerializer)。

最后,这实际上或多或少只是编码风格的问题 - 从功能上讲,它不应该产生任何影响。

马克