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

Есть ли способ изменить пространство имен .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, показывают новое имя пространства имен, что, похоже, несовместимо.

Любые идеи?


person Patrick Szalapski    schedule 27.01.2011    source источник


Ответы (1)


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

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

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

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

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

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

person marc_s    schedule 27.01.2011
comment
Я не использую Добавить ссылку на службу - это дало неожиданные результаты - см. Заголовок stackoverflow.com/questions/1294269/. Может, это все равно сработает? Скоро попробую. - person Patrick Szalapski; 27.01.2011
comment
@Patrick Szalapski: ну, в этом случае вы, вероятно, разделяете сборку контрактов между службой и клиентом, верно ?? В этом случае, конечно, изменение пространств имен в вашем сервисном контракте повлияет на клиента - никоим образом. - person marc_s; 27.01.2011
comment
Это объяснение прояснило это для меня. - person DanielV; 29.12.2015