Цель
Я хотел бы иметь возможность как хостинга, так и подключения к серверу сокетов ванили через WCF, в рамках хостинга, которые я разрабатываю. Я хочу, чтобы иметь возможность использовать WCF для кодирования транспорта и протоколов, которые должны управляться вручную с помощью программ сокетов сегодня. Это позволило бы мне в полной мере взаимодействовать с демонами сервера Linux, которые не раскрывают ничего, кроме традиционных сокетов и проприетарных протоколов. Меня интересует только проверка уровня транспортного канала с использованием WcfTestClient в данный момент. Я понимаю, что WcfTestClient не поддерживает сложные методы обслуживания.
Кто-нибудь думает, что можно сделать работу WcfTestClient для пользовательских транспортных каналов? Было бы очень приятно, если бы вы могли в целом использовать этот клиент для проверки любого количества настраиваемых транспортных каналов.
Обзор
Я работаю над пониманием образца WCF Udp, который включен в SDK Windows, который обычно находится в папке C:\Program Files\Microsoft SDK\Windows\v6.1\Samples\WCFSamples\TechnologySamples\Extensibility\Transport\Udp\CS, предполагая, что файл WCFSamples.zip полностью извлекается из каталога Samples.
Вот шаги, которые я сделал до сих пор:
-
(успех): запустите службу решения и клиент успешно в Visual Studio 2008.
-
(успех): подключиться к конечной точке MEX с помощью WcfTestClient, обычно находящегося в папке C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE
-
(отказ): используйте WcfTestClient, чтобы попытаться выполнить метод из договора ICalculatorContract или IDatagramContract.
Когда я выполняю метод Hello(), например, я получаю следующую ошибку:
Дружественное сообщение:
Не удалось вызвать службу. Возможное причины: услуга отключена или недоступный; клиентская сторона конфигурация не соответствует прокси; существующий прокси недействителен. Обратитесь к трассировке стека подробно. Вы можете попытаться восстановить запуск нового прокси-сервера, восстановление настройка по умолчанию или обновление службы.
Сведения об ошибке:
Пользовательский привязку на ServiceEndpoint с контрактом "IDatagramContract" не хватает TransportBindingElement. каждый обязательный должен иметь по крайней мере одну привязку элемент, который вытекает из TransportBindingElement. в System.ServiceModel.Channels.Binding.EnsureInvariants(String contractName) в System.ServiceModel.Description.ServiceEndpoint.EnsureInvariants() в System.ServiceModel.Channels.ServiceChannelFactory.BuildChannelFactory(ServiceEndpoint serviceEndpoint) в System.ServiceModel.ChannelFactory.CreateFactory() в System.ServiceModel.ChannelFactory.OnOpening() в System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan таймаут) в System.ServiceModel.ChannelFactory.EnsureOpened() в System.ServiceModel.ChannelFactory
1.CreateChannel(EndpointAddress address, Uri via) at System.ServiceModel.ChannelFactory
1.CreateChannel() в System.ServiceModel.ClientBase1.CreateChannel() at System.ServiceModel.ClientBase
1.CreateChannelInternal() в System.ServiceModel.ClientBase`1.get_Channel() в DatagramContractClient.Hello()
Понимание ошибки клиента
UdpTransportBindingElement, определенный в проекте UdpTransport, определенно происходит из TransportBindingElement, как показано ниже, поэтому я думаю, что в файле конфигурации WcfTestClient должно быть что-то отсутствует и/или возможно, что я должен каким-то образом предоставить тестовый клиент с дополнительной информацией. Я попытался в основном копировать раздел System.ServiceModel проекта клиента решения Udp в конфигурационный файл WcfTestClient, а также копировать DLL транспортной сборки в ту же папку, что и тестовый клиент, но я получаю ту же ошибку.
Я понимаю, что конечной точки MEX должно быть достаточно, чтобы получить информацию, необходимую для вызова простых методов в службе. Конечно, я понимаю, что, вероятно, больше похоже на историю, учитывая, что я пытаюсь создать клиента, который был разработан для тестирования готовых транспортных каналов, работающих с настраиваемыми транспортными каналами.
/// <summary>
/// Udp Binding Element.
/// Used to configure and construct Udp ChannelFactories and ChannelListeners.
/// </summary>
public class UdpTransportBindingElement
: TransportBindingElement // to signal that we're a transport
, IPolicyExportExtension // for policy export
, IWsdlExportExtension
Является ли ITransportPolicyImport важным для пользовательских транспортных каналов?
Я спрашиваю об ITransportPolicyImport, потому что это интерфейс, который реализуется стандартными выводами WCF TransportBindingElement, но образец Udp не реализует этот интерфейс, и я не могу найти ничего полезного в веб-поиске или в Safari. Возможно, это даже не актуально.
Например...
public class HttpTransportBindingElement :
: TransportBindingElement
, IWsdlExportExtension
, IPolicyExportExtension
, ITransportPolicyImport
Примеры конфигураций...
Конфигурация службы выглядит следующим образом:
<system.serviceModel>
<!--
add our udpTransport handler for use by binding declarations
-->
<!--
add our standard binding handler for use by binding declarations
-->
<extensions>
<bindingElementExtensions>
<add name="udpTransport" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />
</bindingElementExtensions>
<bindingExtensions>
<add name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
</bindingExtensions>
</extensions>
<services>
<service name="Microsoft.ServiceModel.Samples.ConfigurableCalculatorService" behaviorConfiguration="udpServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/udpsample"/>
</baseAddresses>
</host>
<endpoint address="soap.udp://localhost:8001/"
binding="sampleProfileUdpBinding"
bindingConfiguration="CalculatorServer"
contract="Microsoft.ServiceModel.Samples.ICalculatorContract" />
<endpoint address="soap.udp://localhost:8002/datagram"
binding="customBinding"
bindingConfiguration="DatagramServer"
contract="Microsoft.ServiceModel.Samples.IDatagramContract" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<!--
server bindings
-->
<sampleProfileUdpBinding>
<binding name="CalculatorServer" clientBaseAddress="soap.udp://localhost:8003/" />
<binding name="DatagramServer" reliableSessionEnabled="false" />
</sampleProfileUdpBinding>
<customBinding>
<binding name="DatagramServer">
<binaryMessageEncoding />
<udpTransport/>
</binding>
</customBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="udpServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
<client>
<endpoint address="" binding="sampleProfileUdpBinding" bindingConfiguration="CalculatorServer"
contract="Microsoft.ServiceModel.Samples.ICalculatorContract"
name="CalculatorClient" />
</client>
</system.serviceModel>
Конфигурация клиента из решения выглядит следующим образом:
<system.serviceModel>
<bindings>
<customBinding>
<binding name="CustomBinding_IDatagramContract">
<binaryMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
maxSessionSize="2048">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binaryMessageEncoding>
<UpdTransportElementClientSide maxBufferPoolSize="524288" maxMessageSize="65536"
multicast="false" />
</binding>
</customBinding>
<sampleProfileUdpBinding>
<binding name="SampleProfileUdpBinding_ICalculatorContract" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
orderedSession="true" reliableSessionEnabled="true" sessionInactivityTimeout="00:10:00"
clientBaseAddress="soap.udp://localhost:8003/" />
</sampleProfileUdpBinding>
</bindings>
<client>
<endpoint address="soap.udp://localhost:8001/" binding="sampleProfileUdpBinding"
bindingConfiguration="SampleProfileUdpBinding_ICalculatorContract"
contract="ICalculatorContract" name="SampleProfileUdpBinding_ICalculatorContract" />
<endpoint address="soap.udp://localhost:8002/datagram" binding="customBinding"
bindingConfiguration="CustomBinding_IDatagramContract" contract="IDatagramContract"
name="CustomBinding_IDatagramContract" />
</client>
<extensions>
<bindingElementExtensions>
<add name="UpdTransportElementClientSide" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />
</bindingElementExtensions>
<!-- This was added manually because svcutil.exe does not add this extension to the file -->
<bindingExtensions>
<add name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
</bindingExtensions>
</extensions>
</system.serviceModel>