Como se comunicar com um serviço de janelas de um aplicativo que interage com o ambiente de trabalho?

StackOverflow https://stackoverflow.com/questions/84860

Pergunta

Com .Net qual é a melhor maneira de interagir com um serviço (ou seja, como é que a maioria dos bandeja-apps comunicar com seus servidores). Seria preferível se este método seria multi-plataforma, bem como (trabalhar em mono, então eu acho comunicação remota está fora?)


Editar:

esqueci de mencionar, ainda temos de suportar o Windows 2000 máquinas no campo, de modo WCF e qualquer coisa acima Net 2.0 não vai voar.

Foi útil?

Solução

Esteja ciente de que se você está planejando para finalmente implantar no Windows Vista ou Windows Server 2008, muitas maneiras que isto pode ser feito hoje não vai funcionar. Isto é por causa da introdução de um novo recurso de segurança chamado de "sessão 0 isolamento".

serviços

A maioria das janelas foram movidas para executar na Sessão 0 agora, a fim de isolá-los corretamente desde o resto do sistema. Uma extensão deste é que o primeiro usuário para acessar o sistema não é colocado na sessão # 0, eles são colocados em Sessão 1. E, portanto, o isolamento vai quebrar o código que faz certos tipos de comunicação entre os serviços e aplicações de desktop.

A melhor maneira de escrever código hoje que irá funcionar no Vista e Server 2008 vai para a frente quando se faz a comunicação entre os serviços e aplicações é usar um cross-processo adequado API como RPC, pipes nomeados, etc. Não use SendMessage / PostMessage enquanto que irá falhar sob sessão 0 isolamento.

http://www.microsoft.com/whdc/system/vista/ services.mspx

Agora, dadas suas necessidades, você vai estar em um pouco de picles. Para as preocupações de plataforma cruzada, eu não tenho certeza se Remoting seria apoiado. Você pode ter que cair para baixo e percorrer todo o caminho de volta para sockets: http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx

Outras dicas

Se este é um aplicativo de bandeja, e não um verdadeiro serviço, ter o cuidado de como você configurar as suas comunicações se estiver usando tubos ou TCP / IP. Se vários usuários estão conectados em uma máquina (Citrix, Remote Desktop), e cada usuário inicia um aplicativo de "serviço" de bandeja, então você pode correr em uma situação onde você tem vários processos que tentam usar a mesma porta ou tubo bem conhecida. Claro que isso não é um problema se você não planeja suportar vários tubos ou se você tem um verdadeiro serviço ao contrário de um aplicativo bandeja que é executado em cada shell do usuário.

Tenha o seu serviço de ouvir 127.0.0.1 em uma porta predefinida com um soquete de fluxo TCP velho liso. Conecte-se que a porta de seu aplicativo de desktop.

É simples morto e é completamente multi-plataforma.

Será que qualquer um de vocês realmente tentar comunicação remota com o Mono? Ele funciona muito bem. Você pode topar com alguns casos de canto, mas isso é altamente improvável. Apenas testar seu aplicativo para cross-plataforma (MS.Net <-> Mono) comunicação remota de vez em quando para pegar quaisquer falhas possíveis. E começar com uma recente Mono, 2.4.2 é atual.

Remoting é uma opção, mas não é multi-plataforma. Algumas outras maneiras são usar pipes nomeados, IPC, ou eventos do kernel.

Curiosamente eu ia sugerir Remoting! A Mono 1.0 Release Notes (de archive.org porque o local original está faltando) mencionam System.Runtime.Remoting.dll como uma biblioteca apoiado e não diz nada sobre problemas conhecidos.

Se remoting está fora, então você provavelmente terá que implementar seu próprio protocolo de enquadramento mensagem TCP. O Windows não tem um equivalente de soquetes do domínio Unix para a comunicação na mesma máquina.

A maioria dos serviços que têm um componente GUI são executados como um usuário chamado, e é permitido o acesso ao desktop. Isso permite que você acessá-lo via COM ou .NET, mas apenas localmente (a menos que você quiser se complicado)

Pessoalmente, eu abro um soquete de idade comum sobre o serviço - sua plataforma cruzada, permite que vários clientes, permite que qualquer aplicativo para acessá-lo, não confia na segurança do Windows para ser aberto para ele, e permite que o GUI para ser escrito em qualquer linguagem que você gosta (como soquetes tudo suporta).

Para um aplicativo de bandeja, você iria querer um protocolo simle para se comunicar - assim como você pode usar um sistema de estilo REST para enviar comandos a ele, e XML fluxo (yuk) ou um formato de dados personalizado de volta .

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