C# 我是否需要更新WCF服务引用,当使agment可选时?

C# 我是否需要更新WCF服务引用,当使agment可选时?,c#,web-services,wcf,C#,Web Services,Wcf,我们有一个Web服务,它被许多其他进程使用。 它接受一个对象(由XSD生成)作为参数。此对象中的一个属性(日期时间)现在可以为null 问题是:我现在是否必须找到引用此Web服务的所有进程并更新它们的引用,以便它们继续工作?这是一个棘手的问题 我认为你应该没事,因为你没有删除或添加新的参数的接口 这只是对现有参数的简单更改,在我看来,您只是在放松约束。您不是强制参数不能接受null,而是说它现在是 我相信现有进程一定已经为dateTime属性设置了不可为null的值?因此,对于要利用更改的新流程

我们有一个Web服务,它被许多其他进程使用。 它接受一个对象(由XSD生成)作为参数。此对象中的一个属性(日期时间)现在可以为null


问题是:我现在是否必须找到引用此Web服务的所有进程并更新它们的引用,以便它们继续工作?

这是一个棘手的问题

我认为你应该没事,因为你没有删除或添加新的参数的接口

这只是对现有参数的简单更改,在我看来,您只是在放松约束。您不是强制参数不能接受null,而是说它现在是

我相信现有进程一定已经为dateTime属性设置了不可为null的值?因此,对于要利用更改的新流程,它们必须更新引用,否则不需要更改

不过,改变服务合同通常是个坏主意。您是否考虑过在发行说明中包含更改?以便您的客户了解并采取适当的措施

下面是另一个可能给您带来麻烦的破坏性更改列表

  • 删除操作
  • 更改操作名称
  • 删除操作参数
  • 添加操作参数
  • 更改操作参数名称或数据类型
  • 更改操作的返回值类型
  • 通过显式使用.NET属性或自定义序列化代码更改参数类型(数据协定)或操作(消息协定)的序列化XML格式
  • 修改服务操作编码格式(RPC编码与文档文字)

  • 这是一个棘手的问题

    我认为你应该没事,因为你没有删除或添加新的参数的接口

    这只是对现有参数的简单更改,在我看来,您只是在放松约束。您不是强制参数不能接受null,而是说它现在是

    我相信现有进程一定已经为dateTime属性设置了不可为null的值?因此,对于要利用更改的新流程,它们必须更新引用,否则不需要更改

    不过,改变服务合同通常是个坏主意。您是否考虑过在发行说明中包含更改?以便您的客户了解并采取适当的措施

    下面是另一个可能给您带来麻烦的破坏性更改列表

    • 删除操作
    • 更改操作名称
    • 删除操作参数
    • 添加操作参数
    • 更改操作参数名称或数据类型
    • 更改操作的返回值类型
    • 通过显式使用.NET属性或自定义序列化代码更改参数类型(数据协定)或操作(消息协定)的序列化XML格式
    • 修改服务操作编码格式(RPC编码与文档文字)

    如果仅使属性从非nullable变为nullable,则更改服务合约需要更新服务引用

    您可以创建一个共享项目,在其中维护服务引用,而不是每个项目都使用服务来创建自己的引用。这样,您就不需要检查所有项目和应用程序,也不需要检查每个项目和应用程序的流程


    更好的解决方案仍然是在单独的项目/程序集中定义POCO,并在服务和客户机上引用它。WCF和VS足够智能,可以识别出它不必为服务类创建代理类,而是使用来自单独程序集的POCO。只有在添加/删除类或更改服务接口时,如果更改服务公开的类中的属性,甚至不必更新服务引用。

    更改服务约定时,如果仅使属性从非nullable变为nullable,则需要更新服务引用

    您可以创建一个共享项目,在其中维护服务引用,而不是每个项目都使用服务来创建自己的引用。这样,您就不需要检查所有项目和应用程序,也不需要检查每个项目和应用程序的流程


    更好的解决方案仍然是在单独的项目/程序集中定义POCO,并在服务和客户机上引用它。WCF和VS足够智能,可以识别出它不必为服务类创建代理类,而是使用来自单独程序集的POCO。只有在添加/删除类或更改服务接口时,如果更改服务公开的类中的属性,甚至不必更新服务引用。

    测试后,引用不需要更新,要继续工作:)@ThomasNørgaard所以当将属性更改为可空时,您没有遇到任何问题?是否不需要对客户端进行合同更新?我这样问是因为我可能需要以同样的方式更改公共API契约,但我不能强制现有客户机更新服务引用。通过测试,引用不需要更新,就可以继续工作:)@ThomasNørgaard所以当将属性更改为可空时,您没有遇到任何问题?是否不需要对客户端进行合同更新?我这样问是因为我可能需要以同样的方式更改公共API契约,但我不能强制现有客户机更新服务引用。