Я хотел бы смочь и разместить и соединиться с сервером сокетов ванили через WCF в платформе хостинга, которую я создаю. Я хочу смочь использовать WCF для шифровки транспорта и связи протокола, которой должны вручную управлять программисты сокетов сегодня. Это позволило бы мне окончательную совместимость с демонами сервера Linux, которые выставляют только традиционные сокеты и собственные протоколы. Я только интересуюсь проверкой что слой транспортного канала в общем с помощью WcfTestClient в этой точке. Мое понимание - то, что WcfTestClient не поддерживает сложные сервисные методы.
Кто-либо думает, что возможно заставить WcfTestClient работать на пользовательские транспортные каналы? Это было бы действительно сладко, чтобы смочь в общем использовать этот клиент для тестирования любого количества пользовательских транспортных каналов.
Я работаю для понимания WCF Udp образец, который включен в Windows SDK, расположенный обычно в C:\Program Files\Microsoft SDKs\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.
Когда я выполняюсь Привет () метод, например, я получаю следующую ошибку:
Дружественное сообщение:
Не удалось вызвать сервис. Возможные причины: служба является офлайновой или недоступной; клиентская конфигурация не соответствует прокси; существующий прокси недопустим. Обратитесь к отслеживанию стека для большего количества детали. Можно попытаться восстановиться путем запуска нового прокси, восстановления к конфигурации по умолчанию или обновления сервиса.
Детали ошибки:
CustomBinding на ServiceEndpoint с контрактом 'IDatagramContract' испытывает недостаток в TransportBindingElement. Каждая привязка должна иметь по крайней мере один обязательный элемент, который происходит из TransportBindingElement. в System. ServiceModel. Каналы. Привязка. EnsureInvariants (Представляют contractName в виде строки) в System. ServiceModel. Описание. ServiceEndpoint. EnsureInvariants () в Системе. ServiceModel. Каналы. ServiceChannelFactory. BuildChannelFactory (ServiceEndpoint serviceEndpoint) в System. ServiceModel. ChannelFactory. CreateFactory () в Системе. ServiceModel. ChannelFactory. OnOpening () в Системе. ServiceModel. Каналы. CommunicationObject. Открытый (Тайм-аут TimeSpan) в System. ServiceModel. ChannelFactory. EnsureOpened () в Системе. ServiceModel. ChannelFactory
1.CreateChannel(EndpointAddress address, Uri via) at System.ServiceModel.ChannelFactory
1. CreateChannel () в Системе. ServiceModel. ClientBase1.CreateChannel() at System.ServiceModel.ClientBase
1. CreateChannelInternal () в системе. ServiceModel. ClientBase '1.get_Channel () в DatagramContractClient. Привет ()
UdpTransportBindingElement, который определяется в проекте UdpTransport определенно, происходит из TransportBindingElement, как показано ниже, таким образом, я думаю, что должно быть что-то отсутствующее в конфигурационном файле WcfTestClient и/или возможно что я должен так или иначе предоставить тестовому клиенту больше информации. Я пытался в основном копировать Систему. Раздел ServiceModel клиентского проекта решения Udp в файл конфигурации WcfTestClient, а также копирование транспортного блока dll к той же папке как тестовый клиент, но я получаю ту же ошибку.
Мое понимание - то, что конечной точки MEX должно быть достаточно для получения информации, запрошенной для вызова простых методов для сервиса. Конечно, я понимаю, что существует, вероятно, больше к истории, полагая, что я пытаюсь сделать клиент, который был разработан для тестирования out-of-the-box работы транспортных каналов с пользовательскими транспортными каналами.
/// <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, потому что это - интерфейс, который реализован стандартными деривациями 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>