Когда я использую «Добавить ссылку на службу», я не вижу дополнительных параметров метода - PullRequest
2 голосов
/ 30 июня 2010

Я работаю над службой WCF. У меня одна сервисная операция Function getValues(Optional verbose as Boolean) as List(of String).

Это работает:

'Сначала добавьте ссылку на файл, который содержит интерфейс iRM.
Dim ep3 As EndpointAddress
ep3 = новый адрес конечной точки ("net.pipe: // localhost / RM / RMPipe")
Dim netPipeRMClient As RMLib.iRM netPipeRMtClient = ChannelFactory (Of RMLib.iRM) _ .CreateChannel (новый NetNamedPipeBinding, ep3)

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

Однако это не работает:

'Использовать ссылку на службу для получения типа клиента ... Dim ep3 As EndpointAddress
ep3 = New EndpointAddress ("net.pipe: // localhost / RM / RMPipe")
dim netPipeRMClient as RM.iRMClient = _
новый RM.IRMClient (новый NetPipeBinding, ep3)
Dim foo as List (of String) = netPipeRmClient.getValues ​​()

В последней строке я получаю ошибку во время компиляции, которая говорит: «Аргумент не указан для параметра verbose».

Параметр verbose был явно определен как необязательный в моей подписи метода, но в моем контракте на обслуживание WCF он не является необязательным при использовании клиента, созданного с помощью «Добавить ссылку на службу».

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 30 июня 2010

Необязательные параметры являются специфической функцией .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 и что ООП практика может предложить.

0 голосов
/ 30 июня 2010

Если вы хотите использовать 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");
...