Pergunta

Eu tenho um webservice que eu estou chamando de um aplicativo Windows Forms (ambos NET, ambos na mesma solução), e eu gostaria que meu webservice para retornar um objeto personalizado de outras partes do projeto - é um comum objeto que ambos compartilham uma referência para, como é no terceiro projeto na minha solução. Quando eu chamar o webservice, ele retorna um objeto "Pessoa", mas é no espaço de nomes do webservice, e é criado a partir de uma classe de proxy que o próprio webservice gerado. Como tal, não pode manipulá-lo e devolvê-lo ao meu programa, que está esperando um objeto "Pessoa", baseado na cópia compartilhada da classe, não uma cópia procuração do namespace webservice, e eu recebo um erro quando tento a CType-lo para o tipo de classe correta.

Como faço para forçar o webservice para usar uma cópia local da classe, não uma cópia proxy? A minha pergunta faz qualquer sentido neste contexto? Se não, eu vou esclarecê-lo.

De nota - eu tenho recorrido a passar todos os parâmetros ByRef, e utilizar esses valores devolvidos para preencher uma cópia do objeto que criar em cima do retorno. Isso não pode ser a melhor maneira de fazer isso!

Foi útil?

Solução

Se você estiver usando svcutil.exe para gerar um proxy de cliente WCF, você pode usar / referência na linha de comando para especificar o assembly que contém a classe comum. Svcutil deve reutilizar essa definição de classe em vez de gerar novo no espaço de nomes proxy de serviço.

Além disso, este irá funcionar apenas se sua classe comum é serializado e passado por valor (ou seja, ele é exposto como um contrato de dados, não como um contrato de serviços).

Outras dicas

Se você estiver usando WCF é bastante fácil de usar os mesmos contratos de dados e interface de serviço entre o cliente eo consumidor. Você pode compilar na classe proxy gerado e modificá-lo para usar os namespaces corretos ou usar o ChannelFactory classe para criar um proxy dinâmico para você.

A primeira solução é muito frágil e fará com que você modifique a classe proxy cada vez que a interface de serviço muda. A segunda técnica funciona razoavelmente bem e usamos durante um projeto anterior que trabalhei. Com qualquer um desses métodos que você precisa para garantir que todos os chamadores continuam estão atualizados com a última versão da interface.

Do jeito que você está descrevendo o problema parece que você deseja que o serviço eo cliente para compartilhar a mesma instância. Desde WCF serializa e desserializa seus tipos como você enviá-los de e para o serviço que você teria que fazer algo um pouco mais esperto. É isso que você queria dizer?

Eu não tenho certeza, mas quando você compilar um serviço web .NET ele irá criar um arquivo DLL que você pode tentar usar isso para o local. Mas quando eu estou construindo aplicações orientadas a serviços, eu criar camadas diferentes dentro de minha solução para Camada por exemplo, acesso a dados, lógica de Camadas, Camada de Serviço, Camada de UI, Controlador Camada, e por exemplo, na camada Controlador vou fazer um método de autenticação de usuário que é conectada com a camada de Acesso de dados e Logic layer e então eu vou chamar esse método na camada de serviço e eu também pode chamá-lo sobre a camada de interface do usuário e se eu chamá-lo de dentro da camada de interface do usuário é chamado localmente, quando eu quiser usá-lo a partir da camada de serviço, vou criar um método web usando esse método que irá retornar um bool ou nome de usuário etc.

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