2009-07-22 66 views
16

基本上,我有一个带有成员X和Y的服务器端类型“Foo”。每当我使用Visual Studio的“添加服务器引用”时,我会看到WSDL和生成的代理都向所有成员添加单词“Field”并更改第一个字母的外壳。 IE,“X”和“Y”被重命名为“xField”和“yField”。任何想法为什么发生这种情况?我无法弄清楚这种模式。为什么WCF有时会将“字段”添加到生成的代理类型的结尾?

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

有趣的是我无法弄清楚模式 - 然后。所以我无法弄清WCF为什么/何时重命名变量的模式。

有人知道吗?

+0

重要吗?如果是这样,_how_是否重要? – 2009-07-22 13:13:31

+2

它确实很重要。我有两个用例(对于内部用户和外部用户)。内部用户可以绕过我的包装服务并直接转到底层的传统服务(从而绕过登录需求)。外部用户必须通过包装服务并给它一个密码等。但是由于内部和外部服务现在给这些字段赋予不同的名称,所以我不能共享相同的代码来与这两种服务通信。我需要为每个服务编写不同版本的代码。 – tavistmorph 2009-07-22 14:07:07

回答

3

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

更新:我似乎没有找到任何开关或选项来控制此行为。它可能取决于WCF使用哪个序列化程序(DataContractSerializer与XmlSerializer)创建客户端代理。最后,它实际上或多或少只是编码风格的一个问题 - 在功能上,它不应该有所作为。

Marc

+0

对,这就是NORMALY的工作原理,但我看到公共字段被重命名为。所以内部字段被称为“XFieldField”,公共访问器被称为“XField”。不是我想要的,它意味着包装服务的接口变得与实际服务的接口不同。所以我不能再互相对待这两种服务。 – tavistmorph 2009-07-22 16:05:17

4

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

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

19

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

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

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

} 
0

我有这个问题了,但是从客户端我甚至使在界面上的改变提到后仍然得到Field在类成员结束。

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

后改变DataContractSerializerXmlSerializer,指定其构造的根元素(由typeof()调用)和rootnamespace(因为默认情况下,XmlSerializers写标准命名空间),我可以反序列化的请求,并与完美地工作WCF服务。

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

相关问题