2010-06-29 46 views
2

我正在使用WCF服務。我有一個服務操作Function getValues(Optional verbose as Boolean) as List(of String)當我使用「添加服務引用」時,我看不到可選的方法參數

這工作:

「首先,添加包含IRM接口文件引用。
昏暗EP3作爲的EndpointAddress
EP3 =新的EndpointAddress( 「net.pipe://本地主機/ RM/RMPipe」)
昏暗netPipeRMClient作爲RMLib.iRM netPipeRMtClient =的ChannelFactory(OF RMLib.iRM)_ .CreateChannel(新NetNamedPipeBinding,EP3)

dim foo as List(of String) = netPipeRMClient.getValues() 

然而,這不起作用:

'使用添加服務引用得到客戶端類型... 昏暗EP3作爲的EndpointAddress
EP3 =新的EndpointAddress( 「net.pipe://本地主機/ RM/RMPipe」)
昏暗netPipeRMClient作爲RM.iRMClient = _
新RM.IRMClient(新NetPipeBinding,EP3)
暗淡富爲(一個String)名單= netPipeRmClient.getValues()

在最後一行,我收到寫着「爲參數verbose沒有指定參數」編譯時錯誤。

verbose參數明確定義爲我的方法簽名中可選,但在我的WCF服務合同中,當我使用使用「添加服務引用」創建的客戶端時,它似乎不是可選的。

任何想法?

回答

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的做法可能會提示。

+0

這不會reall你對我有意義。重複一遍,如果我使用對接口的文件引用來初始化我的客戶端,那麼我可以在我的WCF客戶端中使用可選參數。如果我使用「Add Service Reference」初始化我的客戶端,那麼我不能... – 2010-06-29 20:40:19

+2

@Rising Star:如果使用文件引用初始化客戶端,則基本上是「繞過WCF運行時」直接獲取.NET服務合同和數據合同等。添加服務引用使其成爲SOA方式 - 畢竟,您要添加引用的服務可能是IBM HOST上的COBOL服務 - 嘗試向COBOL解釋可選參數..... – 2010-06-29 20:41:38

+0

您也可以使用'添加服務引用「來生成代理類,然後返回並使用可選參數修改類。只要記住,如果您重新生成代理,這些更改將會丟失。 – 2010-06-29 21:07:10

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"); 
相關問題