Domanda

Ciao a tutti

Attualmente sto riscontrando un problema durante la chiamata di un servizio WCF da un servizio Windows. La mia soluzione applicativa è simile a questa.

  • Console di amministrazione Web (progetto Web)
  • Controllo centrale (servizio Windows)
    • Servizio WCF in modo che la Console di amministrazione Web possa connettersi ad esso e configurarlo
    • Diverse chiamate per utilizzare WCF sul nodo (servizio finestre)
  • Nodo (servizio Windows)
    • Servizio WCF per consentire al servizio Windows di controllo centrale di configurarlo

La console di amministrazione Web può accedere al WCF di controllo centrale ma il timeout di controllo centrale ogni volta che tenta di connettersi al nodo. Nel testare questo ho creato un'app Launcher che è un semplice progetto Windows Form che crea un'istanza di ogni servizio e ha un paio di pulsanti che usano una funzione WCF in ciascuno dei servizi di Windows (solo per vedere cosa non funzionava) questa app Launcher Impossibile parlare con nessuno dei servizi di Windows. Questo mi ha confuso, quindi ho aggiunto gli stessi pulsanti a un modulo Web nella console di amministrazione Web e si è collegato perfettamente a entrambi i servizi di Windows tramite WCF. So che la roba WCF sta funzionando in quanto posso colpire attraverso IE e vedere tutto il meraviglioso XML (e ovviamente il fatto che le chiamate funzionano dall'app Web sono una buona indicazione del fatto che sia attivo e funzionante)

In breve Le mie app Web possono utilizzare i servizi WCF nei miei servizi Windows ma Windows Form e i servizi Windows no. Perché questo !?

Ho quasi finito il tempo per questo progetto, quindi le risposte rapide sarebbero fantastiche!

Dettagli tecnici / di codice Non sto usando i file di configurazione nelle applicazioni. Tutto viene creato attraverso il codice e ho usato lo stesso codice per effettuare le mie chiamate WCF ovunque. Inoltre ho cercato di disattivare la sicurezza ovunque nel caso fosse il problema. Inoltre sto usando gli stessi svcutil file proxy generati ovunque per mantenere tutto coerente

Esempio di una chiamata 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()

Il nodo apre il suo 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()

Tutto funzionava prima che io rendessi i vari bit corretti servizi Windows e provassi ad aggiungere installer. Gli installatori funzionano bene e installano i servizi che si avviano e mi permettono di vedere tutto il WCF XML in IE.

Come potresti dire, sono molto nuovo in WCF e questa è la mia prima applicazione che lo usa. I bit fondamentali sono stati praticamente i lavori di copia / incolla / modifica di un campione che non utilizza file di configurazione.

Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

verifica che tutti gli endpoint in appconfig corrispondano alle impostazioni nel webconfig dell'amministratore webapp. ognuno imposta vari valori di timeout, ovvero:

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

spero che ti aiuti. buona fortuna.

Altri suggerimenti

Non sono riuscito a risolverlo correttamente. Sembrava esserci un problema con la comunicazione tra il servizio Windows e il servizio Windows. C'è un modo per farlo accadere da qualche parte, ma ho finito il tempo, quindi l'ho risolto trasformando uno dei bit (il controllo centrale) in una normale applicazione Windows e installato in quel modo. Funziona bene e il cliente è felice :)

Controlla le autorizzazioni per gli utenti con cui sono in esecuzione i servizi di Windows: a loro piace impostare come predefinito il servizio di rete che potrebbe non disporre di autorizzazioni sufficienti. Eseguili come utente dedicato con le autorizzazioni corrette.

E controlla Windows Firewall. Ama bloccare alcune delle tue connessioni web. Di solito lo spengo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top