wcfsvchost visual tools the test studio c# .net wcf interface wcf-binding

c# - visual - ¿Es posible hacer que WcfTestClient funcione para canales de transporte personalizados?



wcftestclient visual studio 2017 (2)

Es posible crear transportes personalizados en WCF. ¡Está bastante involucrado!

Roman Kiss ha creado un transporte nulo que le permite consumir y alojar los servicios desde el mismo proceso sin la sobrecarga de ordenar los datos a través de uno de los transportes integrados. Su artículo CodePlex está disponible en:

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

Puede ser un buen punto de partida para ayudarlo a aprender cómo construir su propio transporte. ¡Buena suerte!

Gol

Me gustaría poder alojar y conectarme a un servidor de sockets de vanilla a través de WCF, dentro del marco de alojamiento que estoy diseñando. Quiero poder usar WCF para codificar las comunicaciones de transporte y protocolo que los programadores de sockets deben administrar manualmente hoy. Esto me permitiría la máxima interoperabilidad con demonios de servidor Linux que no expongan nada más que sockets tradicionales y protocolos patentados. Solo estoy interesado en verificar esa capa de canal de transporte genéricamente utilizando WcfTestClient en este punto. Tengo entendido que WcfTestClient no admite métodos de servicio complejos.

¿Alguien piensa que es posible hacer que WcfTestClient funcione para canales de transporte personalizados? Sería muy agradable poder usar genéricamente este cliente para probar cualquier cantidad de canales de transporte personalizados.

Visión de conjunto

Estoy trabajando para comprender el ejemplo de WCF Udp que se incluye en el SDK de Windows, ubicado típicamente en C: / Archivos de programa / Microsoft SDKs / Windows / v6.1 / Samples / WCFSamples / TechnologySamples / Extensibility / Transport / Udp / CS, asumiendo que el archivo WCFSamples.zip está completamente extraído del directorio Samples.

Estos son los pasos que he dado hasta ahora:

  • (éxito): ejecute el servicio y el cliente de la solución con éxito en Visual Studio 2008.

  • (éxito): conéctese a un punto final MEX utilizando el WcfTestClient ubicado típicamente en C: / Archivos de programa / Microsoft Visual Studio 9.0 / Common7 / IDE

  • (error): use WcfTestClient para intentar ejecutar un método desde el contrato de servicio ICalculatorContract o IDatagramContract.

Cuando ejecuto el método Hello (), por ejemplo, recibo el siguiente error:

Mensaje amistoso:

Error al invocar el servicio. Causas posibles: el servicio está fuera de línea o inaccesible; la configuración del lado del cliente no coincide con el proxy; el proxy existente no es válido. Consulte el seguimiento de la pila para más detalles. Puede tratar de recuperar iniciando un nuevo proxy, restaurando a la configuración predeterminada o actualizando el servicio.

Error de detalles:

El CustomBinding en el ServiceEndpoint con el contrato ''IDatagramContract'' carece de un TransportBindingElement. Cada enlace debe tener al menos un elemento de enlace que se deriva de TransportBindingElement. en System.ServiceModel.Channels.Binding.EnsureInvariants (String contractName) en System.ServiceModel.Description.ServiceEndpoint.EnsureInvariants () en System.ServiceModel.Channels.ServiceChannelFactory.BuildChannelFactory (ServiceEndpoint serviceEndpoint) en System.ServiceModel.ChannelFactory.CreateFactory () en System.ServiceModel.ChannelFactory.OnOpening () en System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) en System.ServiceModel.ChannelFactory.EnsureOpened () en System.ServiceModel.ChannelFactory 1.CreateChannel(EndpointAddress address, Uri via) at System.ServiceModel.ChannelFactory 1.CreateChannel () en System.ServiceModel.ClientBase 1.CreateChannel() at System.ServiceModel.ClientBase 1.CreateChannelInternal () en System.ServiceModel.ClientBase`1.get_Channel () en DatagramContractClient.Hello ( )

Comprender el error del cliente

El UdpTransportBindingElement que se define en el proyecto UdpTransport deriva definitivamente de TransportBindingElement, como se muestra a continuación, así que estoy pensando que debe haber algo que falta en el archivo de configuración WcfTestClient y / o que de alguna manera debo proporcionar al cliente de prueba más información . Intenté básicamente copiar la sección System.ServiceModel del proyecto del cliente de la solución Udp en el archivo de configuración del WcfTestClient, y también copiar el dll del ensamblaje de transporte en la misma carpeta que el cliente de prueba, pero recibí el mismo error.

Según entiendo, el punto final MEX debería ser suficiente para obtener la información requerida para invocar métodos simples en el servicio. Por supuesto, entiendo que probablemente haya más en la historia, teniendo en cuenta que estoy tratando de hacer que un cliente que fue diseñado para probar los canales de transporte listos para usar funcione con canales de transporte personalizados.

/// <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

¿Es ITransportPolicyImport importante para los canales de transporte personalizados?

Pregunto sobre ITransportPolicyImport porque es una interfaz que se implementa mediante las derivaciones estándar de WCF de TransportBindingElement, pero el ejemplo de Udp no implementa esta interfaz, y no puedo encontrar nada útil en las búsquedas web o en Safari. Puede que ni siquiera sea relevante.

Por ejemplo...

public class HttpTransportBindingElement : : TransportBindingElement , IWsdlExportExtension , IPolicyExportExtension , ITransportPolicyImport

Configuraciones de muestra ...

La configuración del servicio se ve así:

<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>

La configuración del cliente de la solución se ve así:

<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>


No conozco los canales de transporte personalizados. Creo que según mi experiencia, puede que no sea posible hacer que WcfTestClient funcione para canales de transporte personalizados.