如何处理Web服务版本中的参数更改

时间:2011-07-01 05:01:39

标签: c# web-services parameters asmx

我对webservices和C#比较新,但不是编程(在遗留系统方面有很多经验)。

我有一个闭环系统 - 我写了一个Web服务和消费应用程序 - 它在PDA上。

发布了Web服务,对于PDA应用程序,我在VS中使用“添加新的Web引用”功能。

然后我可以使用如下代码:

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

一切都很好......直到我发现我需要更新其中一个网络方法,以便在我以前使用2时参考3个参数。

如果我更改网络服务并发布,我所有现有的PDA都会在通话中失败,直到他们获得新版本的PDA软件。有数百个在现场,我不能一次更新它们,也不想要求它们同时更新所有。

解决方案1:

为webservice方法添加版本号,以便SomeMethod现在具有SomeMethodV2(1,2,3) 更新PDA软件以使用s.SomeMethodV2

解决方案2: 将现有的“webServiceName”复制为WebServiceNameV2,其中包含SomeMethod(1,2,3) 将PDA软件更改为引用AppName.com.MyDomain.WebServiceNameV2 在某些时候,当您知道没有PDA正在使用V1时,请关闭该Web服务。

这两种解决方案都有专业的解决方案。 con,但我不相信只有两个;有可能更优雅的方式来处理这种情况?也许不是通过使用“添加新的Web引用”

我正在使用.net 2.0作为PDA,.net 3.5作为webservice; c#为两者。我还没有调查过,但我认为我不能在PDA上使用带有.net 2.0的WCF。

安德鲁

1 个答案:

答案 0 :(得分:1)

我认为混合方法可以为您提供两全其美的优势:

在:

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
    }
}

您现有的端点保持不变,因为您仍在使用相同的合同(接口),前端/更新的PDA的新端点指向新合同,并且您不必复制/复制服务实现 - 只需实施多份合同。