2012-06-18 11 views
5

he seguido este tutorial (al menos en base a mi WCF en esto, coz necesito entonces a trabajar por igual): http://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-applications-using-wcf-callbacks.aspx¿Cómo usar un servicio dual de WCF a través de Internet?

Está funcionando muy bien en mi equipo, pero necesito para usarlo en internet. Al tratar de hacer esto, escuché (a través de Internet) que es mejor usar netTcpBiding.

Voy a tener un servidor que conozca la cantidad de clientes en línea. Quería un servicio WFC en mi IIS en el servidor, y un servicio de Windows consumiéndolo y notificándolo. Necesito la devolución de llamada porque el servidor en algún momento debe poder ejecutar algunos comandos en el cliente.

Estaría muy contento si alguien pudiera ayudarme.

Gracias de antemano,

Editar:

siendo claro: yo no podía hacer que funcione en internet. ¿Pueden mostrarme cómo puedo cambiar mis configuraciones (Web.config e App.config) para usar netTcpBinding y trabajar en Internet?

Gracias de nuevo,

Edit 2:

Mi Web.config en mi WCFServiceApplication es:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior" name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFService"> 
     <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" contract="TiT.PCWatcher.Server.WCFService.Interfaces.IPCWatcherWCFService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

Mi App.config en mi servicio de windows es:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
      textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:25145/Services/PCWatcherWCFService.svc" 
     binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" 
     contract="PCWatcherWCFServiceReference.IPCWatcherWCFService" 
     name="WSDualHttpBinding_IPCWatcherWCFService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

Simplemente cambiándolo a netTcpBinding no funciona ...

Pero me encantaría poder ejecutar esto por Internet ... Publiqué el WCFService en IIS. Enlaces:

https://www2.tcenter.com.br/monitor/PCWatcherWCFService.svc

O

http://www2.tcenter.com.br:8080/monitor/PCWatcherWCFService.svc

Simplemente cambiar las configuraciones de su suficientes para hacer que funcione a través de Internet? como dije, local funciona bien.

pensé que simplemente cambiando la dirección de punto final en el cliente para una de las URL de encima de ella whould funciona, pero no fue así ...

El ejemplo que haya vinculado aloja el servicio en el WPF. No sé si se aplica a mi cenario ...

Creo que me voy a quedar con el DualHttpBinding, no creo que el reenvío de puertos sea bueno para mis necesidades, puedo tener mucho de clientes en una intranet y que el enrutador decida a cuál le va a enviar información porque no está bien, ¿verdad? o hay una manera de hacer que el enrutador responda correctamente a todas y cada una de las máquinas conectándose a mi servidor web a través del mismo puerto?(Sólo pedir, jejeje)

Gracias mucho por adelantado,

edición el 21/06/2012:

gracias por la lectura. No pude hacer que el servicio funcione con netTcpBinding en LAN. Hice una muestra simulada de mi cenario. Es here. Llamado DualCommunicationTest.

Cuando comencé esta publicación, solo quería saber cómo hacer esta aparición en Internet. Solo eso. Durante mi tiempo buscando una solución antes de publicarla aquí, he leído que netTcpBinding es mejor. Así que pregunté sobre eso. Fue solo una pregunta secundaria.

Así que ... mis necesidades actuales en el puesto son:

Cómo usar the sample i developed en Internet.

O

¿Cómo hacer the sample i developed trabajo con netTcpBinding y luego ser capaz de utilizarlo en Internet. (Estoy bastante seguro de que Clunky Coder me enseñó la segunda parte, sobre cómo publicar un net.tcp en Internet con el IIS y esas cosas, muchas gracias por eso, pero no pude probarlo todavía, porque no pude t hacer un netTcp todavía.)

Lo siento si no he sido lo suficientemente claro, mi inglés no es tan bueno. Sry y gracias de nuevo, mucho.

Respuesta

5

netTcpBinding es mejor para la comunicación dúplex (comunicación con devoluciones de llamada) y es más eficaz que WSDualHttpBinding que es el enlace preferido para la comunicación dúplex a través de HTTP. Pero no debería realmente usar netTcpBinding a través de Internet aunque técnicamente puede y podría funcionar, pero los puertos que usa netTcpBinding pueden estar (y normalmente están) bloqueados por cortafuegos en Internet. Cuando envía algo a través de Internet, genera muchos saltos y pasa por muchos enrutadores y cortafuegos, y no hay garantía de que esos enrutadores y cortafuegos tengan todos los puertos abiertos. Pero si puede abrir los puertos (para netTcp es TCP 808) tanto en el cliente como en los puntos finales del servidor (normalmente se realiza reenviar puertos en el enrutador) puede funcionar, pero el consejo general es no usar netTcpBinding a través de Internet. Habiendo dicho eso, lo he usado un par de veces para mis servicios, y mis clientes han podido consumir el servicio a través de Internet sin ningún problema, después de que reenvíe los puertos tanto al cliente como al servidor.

En general para la comunicación dúplex en internet que tienen la WSDualHttpBinding y si usted tiene un cliente de Silverlight (Silverlight no admite WSDualHttpBinding) se puede utilizar PollingDuplexHttpBinding.

También recomiendo que lea this.

EDIT:

Para cambiar ese ejemplo para usar netTcpBinding, simplemente cambiar los enlaces en el archivo de configuración para utilizar en lugar de netTcpBindingwsDualHttpBinding. Eche un vistazo a this article, hace lo que hace el enlace que publicó, con netTcpBinding y más explicación.

EDITAR 20/06/2012:

siendo claro: yo no podía hacer que funcione en internet. ¿Pueden mostrarme cómo puedo cambiar mis configuraciones (Web.config e App.config) para usar netTcpBinding y trabajar a través de Internet?

Parece que se haya podido conseguir que el servicio funcione con netTcpBinding en internet, por lo que su problema anterior ha sido arreglado y ahora está teniendo problemas para que aloja el servicio en IIS y su publicación en línea. Cuando su servicio funciona en una LAN, funcionará en Internet una vez que lo hospede en IIS y reenvíe los puertos apropiados en los enrutadores de clientes y servidores, este es un escenario común y está bien documentado en línea. Para hacer esto, debe alojar su servicio como una aplicación en su sitio web de IIS. Debe asegurarse de que su servicio tenga un archivo .svc que apunte a la ubicación del servicio, luego copie los contenidos de App.Config (archivo de configuración del servicio) en un nuevo web.config (en el mismo directorio físico que su App.config) y también elimine la sección <host><baseAddresses> en el recién creado web.config, señale la ruta física de la aplicación a la ubicación de este servicio en su computadora host de servicio. Una vez que se haya solucionado eso, solo asegúrese de editar los enlaces predeterminados del sitio web para habilitar los enlaces específicos que usa su servicio, para netTcpBinding vaya a: Sitio web -> 'Editar enlaces ...' -> 'Agregar ...' luego elija net .tcp y asígnele los puertos. Luego, en su aplicación vaya a 'Configuración avanzada' y habilite el servicio net.tcp, netTcpBinding que generalmente tendrá http,net.tcp ya que está habilitado para protocolos. Si se encuentra con errores iniciales, asegúrese de que el grupo de aplicaciones predeterminado (o el grupo de aplicaciones que utiliza su sitio web) tenga los permisos necesarios para acceder y leer el directorio físico en el servidor en el que reside el servicio.

Por favor, lea this y this, pidiéndome que elabore sería simplemente repetir lo que están diciendo.

EDITAR 21/06/2012:

que acaba de descargar su servicio y alojado en IIS y se aloja bien, ya que su uso de HTTP y no nettcp entonces eso significa que funciona perfectamente bien en el Internet. Si su servicio es algo simple y no espera hacer un procesamiento pesado con él (por el aspecto de que está tratando de obtener la lista de clientes conectados a él), continúe con wsDualHTTPBinding ya que el protocolo HTTP funcionará en cualquier entorno y no tiene que preocuparse por los firewalls como lo haría con netTcpBinding.Esto es todo lo que hice para alojar el servicio en IIS (y hacer que esté disponible en internet):

  1. Ir a DefaultWebsite en IIS, haga clic derecho, añadir aplicación, en Alias ​​acaba de dar su servicio en cualquier nombre que desee para poder ver en la URL. Seleccione el grupo de aplicaciones predeterminado o el grupo de aplicaciones ASP.NET 4.0.

  2. Señale la ruta de acceso física a su archivo .svc en su computadora; para mí es:

C:\Users\MyPC\Documents\DualCommunicationTest.Server\WcfServiceApp

  1. Bajo los protocolos activados asegurarse de que tiene HTTP en el puerto 80 o cualquier otro puerto, por ejemplo 8085, pero se necesita para reenviar este puerto en el router para la computadora host del Servicio. Si su host de Servicio está en IP 192.168.1.4 en su LAN, entonces en su enrutador reenvíe el puerto 80 (o cualquier puerto que use, digamos 8085) a la computadora 192.168.1.4.

Y así de fácil.

+0

Lectura agradable de verdad ... bien, ya no sé si voy a netTcp o wsDual, pero, ¿podría ayudarme a hacerlo funcionar? Estoy feliz de poner el ejemplo implementado en el enlace de arriba para trabajar ... –

+0

@TanielianBarreira, Acabo de ver el artículo, parece estar bien escrito, ¿cuál es exactamente el problema? Está implementando un servicio de chat simple por apariencia, hay muchos ejemplos de devoluciones de llamada en WCF. la esencia de la idea es que el cliente llama a alguna operación en el servicio, y el servicio puede a su vez llamar a un método en el cliente (esta es la devolución de llamada), por lo que el cliente será temporalmente como un servidor. Los métodos en 'ChatService' son los que los clientes llaman en el servidor, y los métodos en' IChatServiceCallback' es lo que el servicio invoca en los clientes. –

+0

@TanielianBarreira mira mi actualización. –

1

La vinculación TCP es mejor para las devoluciones de llamadas a través de Internet porque TCP es de doble dirección por naturaleza. HTTP es una solicitud, es de una sola vía. De ahí el dual en dualHttpBinding. WCF tiene que crear una segunda conexión HTTP de vuelta al cliente para que el servicio pueda enviar solicitudes al cliente.

Internet no está realmente configurado para que los servidores vuelvan a llamar a través de HTTP. Las cosas como que los enrutadores realizan NAT significa que los puertos deben reenviarse para enrutar correctamente la solicitud HTTP, y el cliente tendría que estar ejecutando un servidor HTTP.

Por lo tanto, es mucho más fácil de usar TCP. O bien eso o posiblemente haga que el cliente solicite un objeto de respuesta que se transmite desde el servidor (una respuesta interminable en efecto), que el servidor puede disparar notificaciones. Esto no es simple sin embargo.

+0

Gracias por su respuesta, pero ¿cómo puedo cambiar el ejemplo anterior para usar netTcp? –

Cuestiones relacionadas