Могу ли я изменить пространство имен интерфейса WCF ServiceContract без изменения службы? - PullRequest
9 голосов
/ 27 января 2011

Есть ли способ изменить пространство имен .NET интерфейса WCF ServiceContract, но при этом сделать службу WCF обратно совместимой с клиентами, которые используют старый (идентичный, кроме пространства имен) ServiceContract? Например, предположим, у меня есть (в vb.net):

Namespace MyCompany.MyPoorlyNamedProject
    <ServiceContract(Name:="ThingService")> _
    <CLSCompliant(True)> _
    Public Interface IThingService
        ...
    End Interface
EndNamespace

И я хочу изменить это на

Namespace MyCompany.MyProject
    <ServiceContract(Name:="ThingService")> _
    <CLSCompliant(True)> _
    Public Interface IThingService
        ...
    End Interface
End Namespace

Без изменения услуги вообще.

Я пытался сделать это, но мои xsds, на которые ссылается wsdl, показывают новое имя пространства имен, что, похоже, несовместимо.

Есть идеи?

1 Ответ

13 голосов
/ 27 января 2011

До тех пор, пока имя и (XML) пространство имен вашего сервисного контракта не изменятся - точно! Службы WCF действительно не заботятся о внутренностях .NET о том, как они реализованы.

Это работает до тех пор, пока клиентская сторона подключается к вашему сервису с использованием стандартного метода Add Service Reference (опрос метаданных службы для создания отдельного прокси на стороне клиента) - в этом случае прокси на стороне клиента имеет нет знания каких-либо пространств имен .NET на стороне службы ... вы можете изменить их на стороне службы и повторно развернуть файлы службы - клиент продолжит работу.

Единственное место, в котором вам нужно выполнить настройку, - это конфигурация вашей сервисной стороны (в web.config, если вы используете хостинг в IIS, в app.config вашего хостера в противном случае):

  • атрибут name= тега <service> имеет полное имя класса .NET для класса обслуживания (включая пространство имен .NET)

  • атрибут contract= тега <endpoint> содержит полное имя типа .NET контракта на обслуживание (включая пространство имен .NET)

Это не работает, очевидно, если вы совместно используете общую сборку с контрактом на обслуживание - в этом случае клиентская сторона будет привязана к пространству имен .NET этих файлов контракта в общей сборке, и если они изменятся, клиент больше не будет работать ..

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