Действительно ли возможно заставить WcfTestClient работать на пользовательские транспортные каналы?

Цель

Я хотел бы смочь и разместить и соединиться с сервером сокетов ванили через 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. ChannelFactory1.CreateChannel(EndpointAddress address, Uri via) at System.ServiceModel.ChannelFactory1. CreateChannel () в Системе. ServiceModel. ClientBase1.CreateChannel() at System.ServiceModel.ClientBase1. 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 важен для пользовательских транспортных каналов?

Я спрашиваю о 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>
14
задан Robert Harvey 4 October 2010 в 21:22
поделиться