Когда вам необходимо внести критическое изменение в 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
Теперь никому не легко увидеть, какая версия новее.
Должен ли я дать интерфейсам разные имена? * Например 1016 *
IVersionedService1
IVersionedService2
или
IVersionedService/2010/01/14
IVersionedService/2010/02/21
Разве это не противоречит цели пространства имен?
Стоит ли размещать их в разных классах обслуживания и получать уникальный URL-адрес для каждой версии?