Подтвердить что ты не робот

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

Цель

Я хотел бы иметь возможность как хостинга, так и подключения к серверу сокетов ванили через 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.ClientBase 1.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>
4b9b3361

Ответ 1

В WCF можно создавать пользовательские транспорты. Это довольно привлекательно!

Roman Kiss построил Null Transport, который позволяет вам потреблять и размещать сервисы из одного и того же процесса без накладных расходов на сортировку данных через один из встроенных транспортов. Его статья CodePlex доступна по адресу:

http://www.codeproject.com/KB/WCF/NullTransportForWCF.aspx

Это может быть хорошей отправной точкой для того, чтобы помочь вам научиться строить собственный транспорт. Удачи!

Ответ 2

Мне не известны пользовательские транспортные каналы. Я думаю, что согласно моему опыту, может быть невозможно заставить WcfTestClient работать для пользовательских транспортных каналов.