Pergunta

Hi All

Atualmente, estou tendo um problema chamando um serviço WCF de um serviço do Windows. Meu Application Solution parece com isso.

  • Web Console de Administração (Project Web)
  • Controle Central (Windows Service)
    • serviço WCF para que o Console de Administração Web pode se conectar a ele e configurá-lo
    • várias chamadas para usar WCF no Nó (Service janela)
  • Node (Windows Service)
    • serviço WCF para permitir que o configure serviço central de controlo do Windows it

O Console de Administração Web pode acessar o Controle WCF Central, mas a Central de Controle expira quando já ele tenta se conectar ao nó. Ao testar esta Eu criei um aplicativo Lançador que é um projeto de formulário do Windows simples que cria uma instância de cada serviço e tem um par de botões que usam uma função WCF em cada um dos serviços do Windows (apenas para ver o que estava falhando) este aplicativo Lançador não podia falar com qualquer um dos serviços do Windows. Este foi me confundido então eu adicionei os mesmos botões para um formulário da Web no console de administração Web e conectado a ambos os Windows Services perfeitamente por meio do WCF. Eu sei que as coisas WCF está funcionando como eu posso batê-lo através do IE e ver toda a maravilhosa XML (e, obviamente, o fato de que as chamadas de trabalhar a partir do aplicativo web são uma boa indicação de que seja instalado e funcionando)

Em suma As minhas aplicações web pode usar os serviços WCF em meus serviços do Windows, mas o Windows Forms e serviços do Windows não pode. Por que isso é!?

Eu praticamente já sem tempo neste projeto tão respostas rápidas seria fantástico!

detalhes Tech / Código Eu não estou usando arquivos de configuração nas aplicações. Tudo está sendo criado através de código e tenho vindo a utilizar o mesmo código para fazer o meu WCF chama todos os lugares. Também tenho tentado transformar segurança off em todo caso, que foi o problema. Também estou usando o mesmo svcutil arquivos proxy gerados em todos os lugares, assim como para manter tudo consistente

Exemplo de uma chamada para o nó

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

O Node abrindo sua 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()

Isso tudo foi trabalho antes que eu fiz os diferentes pedaços adequada Windows Services e tentou adicionar instaladores a ele. A multa instaladores trabalho e instalar os serviços que começam e me permite ver todo o XML WCF no IE.

Como você pode ser capaz de dizer, eu sou muito novo para o WCF e esta é a minha primeira aplicação de usá-lo. Os bits fundamentais têm sido praticamente / colar trabalhos de cópia / Alter partir de uma amostra que não usa arquivos de configuração.

Qualquer ajuda seria muito apreciada.

Foi útil?

Solução

verificar se todos os parâmetros no appconfig corresponder às configurações em webconfig do webapp administrador. cada um conjuntos de vários valores de tempo limite, ou seja:

<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 ajude. boa sorte.

Outras dicas

Eu não poderia trabalhar este para fora corretamente. Parecia haver um problema com o serviço Windows para a comunicação de serviço do Windows. Existe uma maneira de fazer isso acontecer em algum lugar, mas eu corri para fora de tempo, então eu resolvi girando um dos bits (Central Control) em um aplicativo do Windows normal e instalou-lo dessa forma. Funciona bem eo cliente está feliz:)

Verifique as permissões para os usuários que os serviços do Windows estão em execução no - que eles gostam como padrão para serviço de rede que pode não ter permissões suficientes. Executá-los como um usuário dedicado com as permissões corretas.

E verificação Firewall do Windows. Ele gosta de bloquear algumas de suas conexões web. Eu normalmente apenas desligá-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top