我正在使用Visual Studio 2012自动生成WCF服务的代理类。在服务契约中,其中一个方法GetActiveSessions()
被定义为返回Dictionary<Guid, Session>
,但以下是该属性在我的代理类中的显示方式:
public MyNamespace.ArrayOfKeyValueOfguidSessionxjDRWaWoKeyValueOfguidSessionxjDRWaWo[] GetActiveSessions() {
....
}
还有另一个这种奇怪行为的例子,其中本应返回Guid
的服务方法被定义为在我的代理类中返回string
。当我使用代理类定义的方法时,这些方法似乎可以按照指定的方式工作,但我不希望在代码中使用ArrayOfKeyValueOfguidSessionxjDRWaWoKeyValueOfguidSessionxjDRWaWo
类型的对象。
你知道是什么导致了这种奇怪的行为吗?
这是预期行为。代理序列化的有线格式将与WSDL/XSD中定义的方案相匹配。然而,WSDL中有许多匿名类型和数组没有名称,当您使用代理时,需要对它们进行命名。因此WCF通过在元素路径上链接名称来计算唯一的名称。如果您想要一个不同的名称,那么要么在代理之上创建一个包装器(并维护它),要么不要在WSDL中使用匿名类型。