Pregunta

Hola a todos

Actualmente tengo un problema al llamar a un servicio WCF desde un servicio de Windows. Mi solución de aplicación tiene este aspecto.

  • Consola de administración web (proyecto web)
  • Control central (servicio de Windows)
    • El servicio WCF para que la Consola de administración web pueda conectarse a él y configurarlo
    • Varias llamadas para usar WCF en el nodo (Servicio de ventana)
  • Nodo (Servicio de Windows)
    • El servicio WCF para permitir que el servicio de control central de Windows lo configure

La consola de administración web puede acceder al WCF de control central, pero el control central se apaga cuando intenta conectarse al nodo. Al probar esto, creé una aplicación Launcher que es un proyecto simple de Windows Form que crea una instancia de cada servicio y tiene un par de botones que usan una función WCF en cada uno de los servicios de Windows (solo para ver qué estaba fallando) esta aplicación Launcher No se ha podido hablar con ninguno de los Servicios de Windows. Esto me confundió, así que agregué los mismos botones a un formulario web en la Consola de administración web y se conectó a ambos servicios de Windows perfectamente a través de WCF. Sé que las cosas de WCF están funcionando, ya que puedo acceder a ellas a través de IE y ver todo el maravilloso XML (y, obviamente, el hecho de que las llamadas desde la aplicación web son una buena indicación de que está funcionando)

En resumen Mis aplicaciones web pueden usar los servicios WCF en mis servicios de Windows, pero los servicios de Windows Forms y Windows no pueden. ¿¡Por qué es esto !?

¡Ya casi me he quedado sin tiempo en este proyecto, por lo que las respuestas rápidas serían increíbles!

Detalles de tecnología / código No estoy usando archivos de configuración en las aplicaciones. Todo se crea a través del código y he estado usando el mismo código para hacer mis llamadas de WCF en todas partes. También he intentado desactivar la seguridad en todas partes en caso de que ese fuera el problema. También estoy usando los mismos svcutil archivos proxy generados en todas partes también para mantenerlos consistentes

Ejemplo de una llamada al nodo

Dim Bind As New WSHttpBinding(SecurityMode.None, True)
Bind.CloseTimeout = New TimeSpan(0, 0, 10)
Bind.OpenTimeout = New TimeSpan(0, 0, 10)
Bind.SendTimeout = New TimeSpan(0, 0, 10)
Dim client As New BN.BNodeServiceClient(Bind, New EndpointAddress("http://localhost:27374/Node"))
client.sendMessage("Test Message")
client.Close()

El Nodo abre su WCF

BNodeHost = New ServiceHost(GetType(iBNodeService))
BNodeHost.AddServiceEndpoint(GetType(BNodeService), New WSHttpBinding(SecurityMode.None, True), New Uri("http://localhost:27374/Node"))
Dim metadataBehavior As ServiceModel.Description.ServiceMetadataBehavior
metadataBehavior = BNodeHost.Description.Behaviors.Find(Of _
ServiceModel.Description.ServiceMetadataBehavior)()

If metadataBehavior Is Nothing Then
    metadataBehavior = New ServiceModel.Description.ServiceMetadataBehavior()
    metadataBehavior.HttpGetEnabled = True
    metadataBehavior.HttpGetUrl = New Uri("http://localhost:27374/Node")
    BNodeHost.Description.Behaviors.Add(metadataBehavior)
Else
    BNodeHost.Description.Behaviors.Add(metadataBehavior)
End If

BNodeHost.Open()

Todo esto funcionaba antes de hacer que los diferentes servicios de Windows fueran apropiados para los bits e intenté agregarle instaladores. Los instaladores funcionan bien e instalan los servicios que se inician y me permiten ver todos los WCF XML en IE.

Como usted podría decir, soy muy nuevo en WCF y esta es mi primera aplicación que lo usa. Los bits fundamentales han sido prácticamente Copiar / Pegar / Alterar trabajos de una muestra que no utiliza archivos de configuración.

Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

verifique que todos los puntos finales en el appconfig coincidan con la configuración del webconfig de la aplicación web de administración. cada uno establece varios valores de tiempo de espera, es decir:

<system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_ILookupService" 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" allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                     maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                     enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                         realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                         algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <behaviors>
            <endpointBehaviors>
                <behavior name="LargeEndpointBehavior">
                    <dataContractSerializer  ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647"/>
                </behavior>
            </endpointBehaviors>
        </behaviors>

        <client>
            <endpoint address="http://localhost:59599/LookupService.svc"
             binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ILookupService"
             contract="FEEALookupServiceReference.ILookupService" name="WSHttpBinding_ILookupService">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>

espero que ayude. buena suerte.

Otros consejos

No pude resolver esto correctamente. Parecía haber un problema con la comunicación del Servicio de Windows al Servicio de Windows. Hay una forma de hacer que suceda en alguna parte, pero se me acabó el tiempo, así que lo resolví convirtiendo uno de los bits (el Control Central) en una aplicación normal de Windows y lo instalé de esa manera. Funciona bien y el cliente está contento :)

Verifique los permisos para los usuarios con los que se ejecutan los Servicios de Windows; les gusta usar el Servicio de red por defecto, que puede no tener los permisos suficientes. Ejecútelos como un usuario dedicado con los permisos correctos.

Y compruebe Firewall de Windows. Le encanta bloquear algunas de tus conexiones web. Por lo general, simplemente lo apago.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top