当我使用“添加服务引用”时,我看不到可选的方法参数

时间:2010-06-29 20:31:40

标签: .net wcf service-reference

我正在开发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>

有什么想法吗?

2 个答案:

答案 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");