基本上,我有一个带有成员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重命名变量的模式。
有人知道吗?
答案 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);
}