Когда вам нужно внести критическое изменение в ServiceContract, рекомендуется сохранить старый и создать новый, а также использовать некоторый идентификатор версии в пространстве имен.
Если я правильно понимаю, то должен сделать следующее:
[ServiceContract(Namespace = "http://foo.com/2010/01/14")]
public interface IVersionedService
{
[OperationContract]
string WriteGreeting(Person person);
}
[ServiceContract(Name = "IVersionedService", Namespace = "http://foo.com/2010/02/21")]
public interface IVersionedService2
{
[OperationContract(Name = "WriteGreeting")]
Greeting WriteGreeting2(Person2 person);
}
Благодаря этому я могу создать сервис, который поддерживает обе версии. Это действительно работает, и при тестировании из soapUI выглядит нормально.
Однако, когда я создаю клиент в Visual Studio с помощью «Добавить ссылку на службу», VS игнорирует пространства имен и просто видит два интерфейса с одинаковым именем. Чтобы различать их, VS добавляет «1» к имени одного из них. Я получаю прокси, называемые
ServiceReference.VersionedServiceClient
а также
ServiceReference.VersionedService1Client
Теперь никому не легко увидеть, какая версия новее.
Должен ли я давать интерфейсам разные имена? Например
IVersionedService1
IVersionedService2
or
IVersionedService/2010/01/14
IVersionedService/2010/02/21
Разве это не противоречит цели пространства имен?
Должен ли я поместить их в разные классы обслуживания и получить уникальный URL-адрес для каждой версии?