正在运行的WCF合同不匹配案例

时间:2013-01-16 13:56:58

标签: wcf binding contract

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

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

2 个答案:

答案 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)

如果您的服务安装了多个地方。重新检查您的端点地址以确保其指向正确的托管服务器。