Влияет ли добавление метода в WCF ServiceContract существующих клиентов? - PullRequest
12 голосов
/ 10 марта 2009

У нас есть существующий ServiceContract

[ServiceContract(Namespace = "http://somesite.com/ConversationService")]
public interface IConversationService
{
        [OperationContract(IsOneWay = true)]
        void ProcessMessage(Message message);

        [OperationContract(IsOneWay = true)]
        void ProcessMessageResult(MessageResult result);
}

и нам нужно добавить к нему метод

[ServiceContract(Namespace = "http://somesite.com/ConversationService")]
public interface IConversationService
{
        [OperationContract(IsOneWay = true)]
        void ProcessMessage(Message message);

        [OperationContract(IsOneWay = true)]
        void ProcessMessageResult(MessageResult result);

        [OperationContract(IsOneWay = true)]
        void ProcessBlastMessage(BlastMessage blastMessage);
}

Это сломает какие-либо существующие клиенты wcf, которые используют эту услугу? Или нам придется обновить все существующие клиенты wcf?

РЕДАКТИРОВАТЬ: эта служба использует как netTcpBinding и netMsmqBinding

Ответы [ 5 ]

8 голосов
/ 10 марта 2009

Я думаю, что ваши существующие клиенты будут продолжать работать. В конце концов, это очень похоже на SOAP и веб-сервисы в том, что клиент будет подключаться к указанному URL-адресу и запрашивать конкретный сервис. Если вы уберете методы, вы рискуете сломаться (я полагаю, что только при использовании метода), но добавление должно быть безболезненным.

Я только баловался с WCF, но с таким успехом использовал веб-сервисы ASP.NET.

4 голосов
/ 11 марта 2009

Нет, я бы не ожидал, что - добавление новой функциональности / новых методов обслуживания, которые НЕ изменят какие-либо из существующих вызовов методов / функций, не повлияет на "старых" клиентов. Конечно, они не будут знать о новых методах, пока их прокси не будут воссозданы из метаданных или адаптированы вручную.

Но существующие вызовы не должны затрагиваться, если их подпись (данные, которыми они обмениваются) остается неизменной.

Марк

1 голос
/ 18 ноября 2016

Я только что протестировал это с клиентским приложением WCF для Windows (UWP), и оно продолжало работать после обновления приложения-службы WCF. Так что нет : как уже отвечали ранее, ваши клиенты не сломаются, когда вы добавите метод.

Однако я подумал, что стоит упомянуть, как легко обновлять клиенты службы с помощью Visual Studio 2015:

  1. Убедитесь, что ваша служба WFC работает.

  2. Просто перейдите на Solution Explorer,

  3. Развернуть Service References

  4. Щелкните правой кнопкой мыши ссылку на сервис

  5. Нажмите Update Service Reference

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

1 голос
/ 11 марта 2009

Я придерживаюсь более экстремального взгляда на это. Зачем что-то менять? Вместо этого, почему бы не создать новый контракт, унаследовав от старого и добавив новую операцию? Новый контракт может быть выставлен в отдельной конечной точке в той же службе.

Это может быть паранойя, неосведомленная формальным доказательством, но мне кажется, что, если возможно создать клиента, который может отличить, то возможно, что какой-то клиент "сломается", когда вы сделаете изменение. Учтите, что когда вы изменяете контракт на обслуживание, вы не просто изменяете код службы - вы меняете код прокси-сервера в любом клиенте, который обновляет его ссылку на службу. Некоторые, более консервативные клиенты, могут посчитать это причиной для повторного тестирования своего клиентского кода - в конце концов, у них могут быть правила, согласно которым они должны повторно тестировать свой код всякий раз, когда в него вносятся какие-либо изменения.

Существующий клиент будет ссылаться на исходную конечную точку, поэтому не будет влиять добавление новой конечной точки - код не изменится, если выполнено «Обновление справочной службы».

Кроме того, почему даже думают об этом , если вам это не нужно?

1 голос
/ 10 марта 2009

Как правило, добавление к сообщению в SOA-решениях не нарушает контракт. Я считаю, что пока вы не используете двоичный протокол (net.tcp), вы будете поддерживать обратную совместимость.

Я не уверен, что он сломает ваши клиенты, используя двоичные привязки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...