Как обрабатывать изменения параметров в версиях веб-сервиса - PullRequest
0 голосов
/ 01 июля 2011

Я относительно новичок в веб-сервисах и C #, но не в программировании (большой опыт работы с устаревшими системами).

У меня есть система с замкнутым циклом - я пишу веб-сервис и приложение-потребитель - котороенаходится на КПК.

Веб-служба опубликована, и для приложения КПК я использую функцию «Добавить новую веб-ссылку» в VS.

Затем я могу использовать код, подобный:

AppName.com.MyDomain.WebServiceName s = new AppNamecom.MyDomain.WebServiceName();
s.SomeMethod(Param1, Param2);

Все хорошо ... пока я не обнаружу, что мне нужно обновить один из веб-методов, чтобы взять, скажем, 3 параметра, когда я использовал 2.

Если я изменю веб-сервис и опубликую, всемои существующие КПК просто не смогут по вызову, пока они не получат новую версию программного обеспечения КПК.С сотнями в поле я не могу обновить их все сразу, и при этом я не хочу требовать, чтобы они обновляли все одновременно.

Решение 1:

Добавить номер версии вметод веб-службы, так что SomeMethod теперь имеет SomeMethodV2 (1,2,3) Обновление программного обеспечения PDA для использования s.SomeMethodV2

Решение 2. Скопируйте существующее «webServiceName», чтобы сказать WebServiceNameV2, которое имеет SomeMethod (1,2,3) Измените программное обеспечение КПК на ссылку AppName.com.MyDomain.WebServiceNameV2. В какой-то момент, когда вы узнаете, что КПК больше не используют V1, отключите этот веб-сервис.

Оба эти решения имеют свои "за" и "против", но яЯ не уверен, что есть только два;Есть, вероятно, более элегантные способы справиться с этой ситуацией?Возможно, не с помощью «Добавить новую веб-ссылку»

Я использую .net 2.0 для КПК, .net 3.5 для веб-службы;C # для обоих.Я еще не рассматривал это, но не думаю, что смогу использовать WCF с .net 2.0 на КПК.

Andrew

1 Ответ

1 голос
/ 01 июля 2011

Я думаю, что гибридный подход дает вам лучшее из обоих миров:

До:

public interface IMyService
{
    SomeResponse SomeMethod(object param1, object param2);
}

public class MyService : IMyService
{
    public SomeResponse SomeMethod(object param1, object param2)
    {
        // do stuff
    }
}

После:

public interface IMyService
{
    SomeResponse SomeMethod(object param1, object param2);
}

public interface IMyService2
{
    SomeResponse SomeMethod(object param1, object param2, object param3);
}

public class MyService : IMyService, IMyService2
{
    public SomeResponse SomeMethod(object param1, object param2)
    {
        return SomeMethod(param1, param2, null);
    }

    public SomeResponse SomeMethod(object param1, object param2, object param3)
    {
        // do stuff
    }
}

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

...