我有一个托管在 2 台服务器上的 WCF 服务。有一个名为 GetData(param1) 的函数。我将此函数更改为接受 2 个参数,即 GetData(param1,param2)。我更新了 server1 上的服务并更新了客户端代码。
一件奇怪的事情正在发生。尽管功能不匹配,但更新后的客户端代码仍然适用于过时的服务。正在调用该函数并返回结果。如果有帮助,添加的参数是枚举值类型。但是为什么会有这种非确定性的行为呢?它是如何工作的?
这就是当您以程序方式设计方法时,所有输入参数默认情况下都是可选的,如果您没有明确指定它们,则使用默认值填充它们。假设您有一个具有以下签名的方法:
[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 属性明确指定需要哪个参数以及是否允许默认值。
希望能帮助到你!
如果你的服务已经安装了不止一次的地方。重新检查您的端点地址以确保其指向正确的托管服务器。