Случай несоответствия контракта WCF, который работает

У меня есть служба WCF, размещенная на 2 серверах. Была функция GetData(param1). Я изменил эту функцию, чтобы она принимала 2 параметра, т.е. GetData(param1,param2). Я обновил службу на server1 и обновил клиентский код.

Происходит странная вещь. обновленный клиентский код по-прежнему работает с устаревшей службой, хотя функции не совпадают. Функция вызывается, и возвращаются результаты. Добавленный параметр является типом значения перечисления, если это помогает. Но почему такое недетерминированное поведение? и как это работает?


person mustafabar    schedule 16.01.2013    source источник
comment
Нужно увидеть OperationContract, чтобы узнать, что здесь происходит.   -  person Nick Ryan    schedule 16.01.2013


Ответы (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.

Надеюсь, поможет!

person Maksym Strukov    schedule 17.01.2013

Если ваш сервис был установлен более одного раза, место. Перепроверьте адрес конечной точки, чтобы убедиться, что он указывает на правильный размещенный сервер.

person sonal    schedule 16.01.2013