C# 在Web服务中重载空洞/添加可选参数的问题

C# 在Web服务中重载空洞/添加可选参数的问题,c#,web-services,overloading,C#,Web Services,Overloading,我们处理这个问题已经有相当一段时间了,只找到了一半有用的解决方案 Web服务应用程序中名为“MainVoid”的主要方法需要有额外的参数,例如: MainVoid(之前): 进入(MainVoid(之前)): 我们有几个应用程序使用了这个空白,但我们不想重建/重新发布所有。理想的情况是,旧应用程序调用void时少用一个参数,而“新”应用程序可以调用相同的void,但多用一个参数 正如我所知,不幸的是,在WCF中使用可选参数是不可能的,这是一个相当大的问题 然后,我们试图重载下面的函数 [Oper

我们处理这个问题已经有相当一段时间了,只找到了一半有用的解决方案

Web服务应用程序中名为“MainVoid”的主要方法需要有额外的参数,例如:

MainVoid(之前):

进入(MainVoid(之前)):

我们有几个应用程序使用了这个空白,但我们不想重建/重新发布所有。理想的情况是,旧应用程序调用void时少用一个参数,而“新”应用程序可以调用相同的void,但多用一个参数

正如我所知,不幸的是,在WCF中使用可选参数是不可能的,这是一个相当大的问题

然后,我们试图重载下面的函数

[OperationContract]
采用类似的方法:

调试Web服务工作正常(如果未传递任何参数,则插入可选的参数默认值)。 在另一个调用WebService的项目中,Intellisense发现重载方法(它提供了两个选项,而不是一个)

但是,当我们在调用web服务的应用程序上运行调试时,调试器需要所有参数,因此它会抛出一个错误

很抱歉这么长的帖子,但我已经尽可能地解释了我们的问题。第二种方法要求更改其他项目中的引用文件,因此它不是所需的解决方案


我猜除了用不同的名称创建两个空洞之外,没有其他方法了?

使用不同的名称至少会更清楚。即使在普通C#中,如果没有任何可选参数或web服务位,重载也有足够的奇怪之处


另一种选择是将web服务更改为使用自定义参数类型,并随着时间的推移向该参数类型添加更多信息。

使用不同的名称至少会更清晰。重载即使在普通C#中也有足够的奇怪之处,没有任何可选参数或web服务位


另一种选择是将web服务更改为使用自定义参数类型,并随时间向该参数类型添加更多信息。

如何将新参数定义为可为空的数据类型(即
int?
)并在方法实现中检查
Parameter4==null
Parameter4.HasValue


然后您只需要一个方法。

如何将新参数定义为可为空的数据类型(即
int?
),并在方法实现中检查
Parameter4==null
Parameter4.HasValue


您只需要一种方法。

您好!谢谢你的回答。你有没有第二条建议的例子?你好!谢谢你的回答。您是否有第二个建议的示例?我也尝试使用可空类型,如:(int?parameter=0),但Web服务对此也不满意。如果函数中缺少一个参数,则需要多个参数。我想我会选择Jon Skeet的解决方案。我们有几个项目不能停止,因为在web服务中出现了一些错误。不过我觉得这会更容易。嗯,很有趣。我确实尝试过这种方法,并且能够从“旧”和“新”客户端发送消息,没有问题。不过,我没有使用默认值。我简单地将参数定义为
int?参数
而不是
int?参数=0
。我不确定这是否有什么区别。我试过int?parameter=0和DateTime parameter=DateTime。虽然我们使用的是.NET4.0框架,但现在我们运气不好。我认为int?表示默认值为null,而int?=0表示默认值为0。但对于第一种情况,我不是100%…我也尝试使用可为null的类型,比如:(int?parameter=0),但Web服务对此也不满意。如果函数中缺少一个参数,则需要多个参数。我想我会选择Jon Skeet的解决方案。我们有几个项目不能停止,因为在web服务中出现了一些错误。不过我觉得这会更容易。嗯,很有趣。我确实尝试过这种方法,并且能够从“旧”和“新”客户端发送消息,没有问题。不过,我没有使用默认值。我简单地将参数定义为
int?参数
而不是
int?参数=0
。我不确定这是否有什么区别。我试过int?parameter=0和DateTime parameter=DateTime。虽然我们使用的是.NET4.0框架,但现在我们运气不好。我认为int?表示默认值为null,而int?=0表示默认值为0。但我不是100%赞成第一个案子。。。
public void Main Void (string Parameter1, int Parameter2, bool Parameter 3, int Parameter4)
[OperationContract]