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

时间:2009-07-22 12:30:33

标签: c# wcf asmx

基本上,我有一个带有成员X和Y的服务器端类型“Foo”。每当我使用Visual Studio的“添加服务器引用”时,我看到WSDL和生成的代理都将“字段”一词附加到所有成员并更改第一个字母的大小写。 IE,“X”和“Y”被重命名为“xField”和“yField”。知道为什么会这样吗?我无法弄清楚这种模式。

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

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

有人知道吗?

5 个答案:

答案 0 :(得分:23)

我有同样的问题,而sergiosp的回答让我朝着正确的方向前进。只需添加一些额外信息即可帮助其他人。

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

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

}

答案 1 :(得分:4)

我有同样的问题,但我能找到解决方案。

在界面中,如果添加[DataContractFormat]标记,最终会出现“XFieldField”情况。 但是如果用接口中的[XmlSerializerFormat]替换它,它将不会更改生成的代理中的名称。

答案 2 :(得分:3)

通常,生成的代理将“XField”和“YField”作为内部/保护/私有字段,并通过名为“X”和“Y”的属性公开值。根据您的喜好,您可以在创建代理客户端时根据自己的喜好设置选项。

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

最后,它或多或少只是一个编码风格的问题 - 从功能上讲,它应该没有什么区别。

马克

答案 3 :(得分:0)

我也有这个问题,但是从客户端我仍然在类成员的最后得到Field,即使在界面上进行了上述改动之后。

问题是,我使用DataContractSerializer来处理磁盘文件序列化请求(在我们的服务测试期间,我们从提供程序获得序列化请求,以便能够在上线之前进行调试)。

DataContractSerializer更改为XmlSerializer后,在其构造函数上指定根元素(通过typeof()调用)和rootnamespace(因为默认情况下,XmlSerializers写入标准命名空间),我可以反序列化请求并与WCF服务完美配合。

希望这有助于某人。这个“问题”让我失去了太多时间。

答案 4 :(得分:0)

添加XmlSerializerFormat对我有用。得到http://geekswithblogs.net/mipsen/archive/2010/02/06/field-postfix-in-wcf-reference.aspx

的解决方案
[ServiceContract(Namespace="http://somenamespace.com/contracts")]    
public interface ISchemaService
{
    [OperationContract]
    [XmlSerializerFormat]
    void DoSomething(GeneratedType data);
}