Question

Bonjour à tous

Je rencontre actuellement un problème lors de l'appel d'un service WCF à partir d'un service Windows. Ma solution d'application ressemble à ceci.

  • Console d'administration Web (projet Web)
  • Contrôle central (service Windows)
    • Service WCF afin que la console d'administration Web puisse s'y connecter et le configurer
    • Plusieurs appels à utiliser WCF sur le nœud (service Windows)
  • nœud (service Windows)
    • Service WCF permettant au service Windows de contrôle central de le configurer

La console d'administration Web peut accéder au WCF de contrôle central, mais celui-ci expire chaque fois qu'il essaie de se connecter au nœud. En testant cela, j'ai créé une application Launcher qui est un simple projet Windows Form, qui crée une instance de chaque service et comporte quelques boutons qui utilisent une fonction WCF dans chacun des services Windows (juste pour voir ce qui échouait), cette application Launcher. ne pouvait parler à aucun des services Windows. Cela m'a déroutée. J'ai donc ajouté les mêmes boutons à un formulaire Web dans la console d'administration Web et ce dernier s'est parfaitement connecté aux deux services Windows via WCF. Je sais que le contenu de la WCF fonctionne, car je peux y accéder via Internet Explorer et voir tout le merveilleux XML (et bien entendu, le fait que les appels fonctionnent depuis l'application Web est une bonne indication de son fonctionnement)

En bref Mes applications Web peuvent utiliser les services WCF dans mes services Windows, mais pas les services Windows Forms et Windows. Pourquoi est-ce!?

Je suis à peu près déjà à court de temps pour ce projet, alors des réponses rapides seraient géniales!

Détails techniques / codes Je n'utilise pas de fichiers de configuration dans les applications. Tout est en cours de création grâce au code et j'utilise le même code pour effectuer mes appels WCF partout. De plus, j'ai essayé de désactiver la sécurité partout au cas où le problème se poserait. De plus, j'utilise les mêmes fichiers de proxy générés par svcutil partout pour que tout soit cohérent

.

Exemple d'appel vers le nœud

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

Le nœud ouvrant sa 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()

Tout fonctionnait avant que je mette au point les différents services Windows Services et que je tente d’y ajouter des programmes d’installation. Les installateurs fonctionnent bien et installent les services qui démarrent et me permettent de voir tout le XML WCF dans IE.

Comme vous le savez peut-être, je suis très novice dans la WCF et c’est la première fois que je l’utilise. Les bits fondamentaux sont en gros des travaux de copier / coller / altérer à partir d’un exemple qui n’utilise pas de fichiers de configuration.

Toute aide serait grandement appréciée.

Était-ce utile?

La solution

vérifiez que tous les points de terminaison de l'appconfig correspondent aux paramètres de la configuration Web de l'administrateur Webapp. chacun définit différentes valeurs de délai d'attente, à savoir:

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

espérons que cela aide. bonne chance.

Autres conseils

Je ne pouvais pas résoudre ce problème correctement. Il semblait y avoir un problème avec la communication entre services Windows. Il y a un moyen de le faire arriver quelque part mais je n'ai plus beaucoup de temps, je l'ai donc résolu en transformant l'un des éléments (le contrôle central) en une application Windows normale et en l'installant ainsi. Fonctionne bien et le client est content:)

Vérifiez les autorisations des utilisateurs sous lesquels s'exécutent les services Windows. Ils préfèrent utiliser le service réseau par défaut, qui peut ne pas disposer d'autorisations suffisantes. Exécutez-les en tant qu'utilisateur dédié avec les autorisations appropriées.

Et vérifiez le pare-feu Windows. Il adore bloquer certaines de vos connexions Web. J'ai l'habitude de l'éteindre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top