Случай несоответствия контракта WCF, который работает
У меня есть служба WCF, размещенная на 2 серверах. Была функция с именем GetData(param1). Я изменил эту функцию, чтобы принимать 2 параметра, т.е. GetData(param1,param2). Я обновил сервис на сервере server1 и обновил код клиента.
Странная вещь происходит. обновленный код клиента по-прежнему работает с устаревшей службой, хотя функции не совпадают. Функция вызывается и результаты возвращаются. Добавленный параметр является типом значения перечисления, если это помогает. Но почему такое недетерминированное поведение? и как это работает?
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.
Надеюсь, поможет!
Если у вас установлен сервис более одного раза. Перепроверьте ваш адрес конечной точки, чтобы убедиться, что он указывает на правильный сервер.