我正在开发WCF服务。我有一个服务操作Function getValues(Optional verbose as Boolean) as List(of String)
。
这有效:
'首先,添加包含iRM界面的文件引用 Dim ep3作为EndpointAddress
ep3 =新的EndpointAddress(“net.pipe:// localhost / RM / RMPipe”)
昏暗的netPipeRMClient作为RMLib.iRM netPipeRMtClient = ChannelFactory(Of RMLib.iRM)_ .CreateChannel(New NetNamedPipeBinding,ep3)
dim foo as List(of String) = netPipeRMClient.getValues()
然而,这不起作用:
'使用添加服务参考来获取客户端类型... Dim ep3作为EndpointAddress
ep3 =新的EndpointAddress(“net.pipe:// localhost / RM / RMPipe”)
dim netPipeRMClient为RM.iRMClient = _
新的RM.IRMClient(新的NetPipeBinding,ep3)
Dim foo作为List(of String)= netPipeRmClient.getValues()
在最后一行,我收到一个编译时错误,上面写着“没有为参数verbose
指定参数”。
verbose
参数在我的方法签名中明确定义为可选,但在我的WCF服务合同中,当我使用通过“添加服务引用”创建的客户端时,它似乎不是可选的。 / p>
有什么想法吗?
答案 0 :(得分:3)
可选参数是.NET特有的功能 - WCF服务本质上是可互操作的,因此您不能依赖.NET细节。
您在WCF中交换的任何内容都基于XML架构和WSDL。据我所知,WSDL对可选参数没有任何支持。 WCF及其底层管道不知道这些事情 - 所以你不能在WCF服务中使用它们。
您需要在WCF服务调用中找到一种没有可选参数的方法。
还有一些其他的东西,WCF / SOA做得不好,在OOP / .NET中完全没问题 - 运算符重载,接口,泛型等等 - 你总是要考虑到WCF是旨在成为可互操作的SOA平台,例如它必须能够与其他语言和系统交流,如PHP,Ruby等 - 其中一些不支持.NET的所有细节。
SOA和OOP有时候不一致 - 这只是生活中的一个事实。如果你想使用SOA和WCF(我强烈反对这种方法),那么你需要愿意“以SOA方式” - 即使这与你在.NET中可以做的事情相违背OOP实践可能会暗示。
答案 1 :(得分:0)
如果您愿意使用ChannelFactory<...>
代替Add Service Reference
,则可以执行此类操作(重复使用现有服务合约界面)
......合同......
[ServiceContract]
public interface IService1
{
[OperationContract]
string Echo(string input = "Default!!!");
}
...用法......
// you can still provide most of these values from the app.config if you wish
// I just used code for this example.
var binding = new BasicHttpBinding();
var factory = new ChannelFactory<IService1>(binding);
var endpoint = new EndpointAddress("http://localhost:8080/service1");
var channel = factory.CreateChannel(endpoint);
var resultDefault = channel.Echo();
var resultInput = channel.Echo("Input");