1

我有一个托管在 2 台服务器上的 WCF 服务。有一个名为 GetData(param1) 的函数。我将此函数更改为接受 2 个参数,即 GetData(param1,param2)。我更新了 server1 上的服务并更新了客户端代码。

一件奇怪的事情正在发生。尽管功能不匹配,但更新后的客户端代码仍然适用于过时的服务。正在调用该函数并返回结果。如果有帮助,添加的参数是枚举值类型。但是为什么会有这种非确定性的行为呢?它是如何工作的?

4

2 回答 2

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 属性明确指定需要哪个参数以及是否允许默认值。

希望能帮助到你!

于 2013-01-17T19:29:49.170 回答
-1

如果你的服务已经安装了不止一次的地方。重新检查您的端点地址以确保其指向正确的托管服务器。

于 2013-01-16T16:46:54.267 回答