我在2台服务器上托管了WCF服务。有一个名为GetData(param1)的函数。 我改变了这个函数来接受2个参数,即GetData(param1,param2)。 我更新了server1上的服务,并更新了客户端代码。
一件奇怪的事情正在发生。尽管功能不匹配,更新的客户端代码仍然可以使用过时的服务。正在调用该函数并返回结果。如果有帮助,添加的参数是枚举值类型。但为什么会出现这种非确定性的行为呢?它是如何工作的?
答案 0 :(得分:2)
这是因为当您以过程方式设计方法时,默认情况下所有输入参数都是可选的,如果您没有明确指定它们,则使用默认值填充。假设您有一个具有以下签名的方法:
[OperationContract]
void TestMethod(string param1, int param2);
您将获得以下WSDL:
<xs:element name="TestMethod">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="param1" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="param2" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:element>
正如您所见,minOccurs属性具有0值,这意味着该元素是可选的。因此,即使添加了新参数,您的方法也能正常工作,这并不奇怪。
如果要避免此行为,请尝试使用MessageContract以消息方式设计合同,或者至少将所有参数包装在容器类中。并明确指定哪个参数是必需的,以及它是否允许通过DataMember属性使用默认值。
希望它有所帮助!
答案 1 :(得分:-1)
如果您的服务安装了多个地方。重新检查您的端点地址以确保其指向正确的托管服务器。