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 に答える