Web 服务中重载 void/添加可选参数的问题
我们已经处理这个问题很长一段时间了,但只找到了一半有用的解决方案。
我们在 Web 服务应用程序中称为“MainVoid”的主要方法需要具有附加参数,例如:
MainVoid (before):
public void MainVoid (string Parameter1, int Parameter2, bool Parameter 3)
Into (MainVoid (before)):
public void Main Void (string Parameter1, int Parameter2, bool Parameter 3, int Parameter4)
我们很少有应用程序使用此 void,但我们不想重建/重新发布全部。理想的情况是旧应用程序调用 void 时少一个参数,而“新”应用程序则可以调用 void 但多一个参数。
据我所知,不幸的是,在 WCF 中使用可选参数是不可能的,这是一个很大的问题。
然后我们尝试使用
[OperationContract]
与此类似的方法重载以下函数: 重载方法在Web服务中
调试Web服务工作正常(如果没有传递参数,则插入可选参数默认值)。 在调用 WebService 的其他项目中,Intellisense 会发现重载方法(它提供了 2 个选项,而不是一个)。
但是,当我们在调用 Web 服务的应用程序上运行调试时,调试器需要所有参数,因此会引发错误。
很抱歉发了这么长的帖子,但我已尽力尽可能地解释我们的问题。第二种方法需要更改其他项目中的参考文件,因此它不是一个想要的解决方案。
猜猜除了创建两个具有不同名称的空白之外没有其他方法吗?
We've been coping with this issue for quite some time and find only half useful solutions.
Our main method in Web Service application called "MainVoid" needs to have additional parameter for example:
MainVoid (before):
public void MainVoid (string Parameter1, int Parameter2, bool Parameter 3)
Into (MainVoid (before)):
public void Main Void (string Parameter1, int Parameter2, bool Parameter 3, int Parameter4)
We have few application which used this void but we don't want to rebuild/republish all. The ideal scenario would be that old applications would call void with one parameter less, whereas "new" applications would could the same void but with one parameter more.
As I know, unfortunately using optional parameters is not possible in WCF which is quite a big issue.
Then we tried to overload functions bellow
[OperationContract]
With similar approach to this: overloading methods in web service
Debugging Web Service works fine (if no parameter is passed then optional parameter default value is inserted).
In other project which calls the WebService the Intellisense finds overloaded methods (it offers 2 options, instead of one).
But when we run debug on the application which is calling web service the debugger wants all parameters so it throws an error.
Sorry for such a long post but I've tried to explain our problem as best as possible. The second approach demands changing of reference files in other projects so it's not a wanted solution.
Guess there is no other way than creating 2 voids with different name?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在我看来,使用不同的名称至少会更清晰。即使在普通的 C# 中,重载也有足够的奇怪之处,没有任何可选参数或 Web 服务位。
另一种替代方法是更改 Web 服务以使用自定义参数类型,并随着时间的推移向该参数类型添加更多信息。
Using different names would at the very least be clearer IMO. Overloading has enough oddities even within plain C#, without any optional parameters or web service bits going on.
Another alternative is to change the web service to use a custom parameter type, and add more information to that parameter type over time.
如何将新参数定义为可为 null 的数据类型(即
int?
)并在方法内检查Parameter4 == null
或Parameter4.HasValue
执行?那么您只需要一种方法。
How about defining the new parameter as a nullable datatype (i.e.
int?
) and checking forParameter4 == null
orParameter4.HasValue
within the method implementation?You would then only need one method.