Erro de referência de serviço: falha ao gerar código para a referência de serviço

131

Eu tenho uma solução de serviço do Windows e estou tentando adicionar uma referência de serviço a um serviço da Web Hermes (servidor de mensagens de fonte aberta ebms) no VS2010.

Posso encontrar o serviço Web usando sua URL, mas quando tento preencher a referência de serviço, obtenho os seguintes erros no Visual Studio:

Error 8 Custom tool error: Failed to generate code for the service reference 'testService'.  Please check other error and warning messages for details. C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler


Warning 6 Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 7 Custom tool warning: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:service[@name='EbmsMessageStatusQuery']/wsdl:port[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 5 Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter
Error: Schema with target namespace 'http://service.ebms.edi.cecid.hku.hk/' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Alguma investigação pareceu sugerir que o svcutil.exe não foi capaz de criar os proxys por não ter permissões para um diretório (possivelmente c: \ windows \ temp). Tentei atribuir várias permissões de acesso, mas não tenho certeza de qual usuário precisa da permissão ou se é apenas um arenque vermelho.

Qualquer idéia seria muito apreciada.

obrigado

jheppinstall
fonte

Respostas:

303

É necessário desmarcar a opção Reutilizar tipos em todos os assemblies referenciados na opção Configurar referência de serviço

Verifique isto para detalhes

Mohan
fonte
3
Como alternativa, quando "Reutilizar tipos em montagens referenciadas" é realmente necessário, você pode adicionar a referência de serviço de um projeto da Biblioteca de Classes criado especificamente para essa finalidade. Verifique minha resposta para obter informações adicionais.
Florin Dumitrescu
Eu queria uma solução sem desmarcar "tipos de reutilização" e consegui encontrar uma que funcionasse, veja minha resposta aqui .
Shahin Dohan
Em vez de fazer algo assim, use os assemblies dos quais o cliente WCF depende, em vez de usar todos os referenciados às cegas. Pode ser complicado e mais demorado do que desmarcar a caixa de seleção em questão, mas acho que essa solução é mais adequada do que a marcado como resposta.
Oscar Guillamon 01/10/19
Também certifique-se o seu projeto não é lido Only..This era o meu problema ..
jain arihanth
126

Clique com o botão direito do mouse na referência de serviço e escolha Configure Service Reference...

Configurar referência de serviço

Em seguida, desmarque Reuse types in referenced assemblies

Tipos de reutilização

Clique OK, limpe e reconstrua sua solução.

Darren
fonte
2
E se eu precisar reutilizar os assemblies referenciados? Eu tenho um projeto e essa caixa de seleção está marcada. A atualização funciona na minha máquina, mas na máquina de um colega de trabalho, não ... nenhuma pista?
Ricardo Appleton
Isso aconteceu quando eu atualizei da v4.6.1 para a v4.7 com o meu projeto. Isso consertou.
9138 Mike
17

Também encontrei um erro semelhante ao tentar gerar o cliente para um serviço da Web a partir de um projeto ASP .Net MVC 4.0 usando o Visual Studio 2012.

A raiz do problema parece ser o fato de que o projeto de onde eu estava tentando gerar o cliente fazia referência a um assembly, que por sua vez dependia de outro assembly que não estava sendo referenciado também.

Quando "Reutilizar tipos em montagens referenciadas" está ativado na configuração do serviço, o gerador de serviços provavelmente está inspecionando todas as montagens referenciadas para obter uma lista dos tipos que podem ser reutilizados. O fato de um dos conjuntos referenciados referenciar outro conjunto que não está disponível provavelmente está causando uma falha no gerador.

Desmarcar "Reutilizar tipos em montagens referenciadas" nas configurações de serviço resolverá o problema acima , mas há um efeito colateral nele. A opção de tipos de reutilização existe por um motivo e, em alguns casos, evita a transmissão desnecessária no código que consome o serviço.

Por exemplo, se o serviço em si for criado usando o WCF e alguns parâmetros de métodos contidos nele forem do tipo System.Guid, eles serão convertidos em seqüências de caracteres no cliente gerado se a opção de tipos de reutilização estiver desabilitada.

Uma alternativa que eu prefiro desativar tipos de reutilização é adicionar a referência de serviço do projeto da Biblioteca de Classes criado especificamente para esse fim. O único aspecto a ter em mente é copiar todas as configurações relacionadas ao serviço do app.config da biblioteca de classes para o arquivo de configuração do projeto de inicialização.

Se houver tipos definidos em assemblies locais que precisam ser reutilizados no cliente de serviço, esses assemblies simplesmente precisam ser referenciados no projeto da biblioteca de classes acima mencionado, juntamente com todas as suas dependências.

Florin Dumitrescu
fonte
Esquisito. Alterei minha ligação de HttpBinding para NetNamedPipeBinding (também adicionei um ponto de extremidade mex) e a agrupei no meu assembly cliente A. Criei uma nova classe libary B que referenciava meu serviço WCF. Então eu adicionei B como referência a A e magicamente tudo funciona novamente. Muito estranho. Agradecimentos para a solução
citronas
1

Seria extremamente difícil adivinhar o problema, pois é devido a um erro no WSDL e, sem examinar o WSDL, não posso comentar muito mais. Portanto, se você pode compartilhar seu WSDL, faça-o.

Tudo o que posso dizer é que parece haver um esquema ausente no WSDL (com o namespace de destino 'http://service.ebms.edi.cecid.hku.hk/'). Conheço problemas e manipulação diferente do esquema quando as instruções de inclusão são ignoradas.

Geralmente, eu acho a implementação de serviços da Web muito boa pela Microsoft, então acho que o serviço está enviando WSDL desonesto.

Aliostad
fonte
Obrigado Aliostad, vou tentar compartilhar o WSDL quando chegar do trabalho.
jheppinstall
0

Eu recebo o mesmo erro no Silverlight 5 (VS2012)

Você também pode remover as referências a:

  • System.ServiceModel.DomainServices.Client
  • System.ServiceModel.DomainServices.Client.Web

Depois de atualizar as referências de serviço, adicione-as novamente.

CartoJunkie
fonte
0

Como afirmado acima, existem alguns problemas diferentes possíveis. O que descobrimos é que o .DLL da biblioteca WCF foi adicionado como uma referência ao projeto do cliente. Isso, por sua vez, criou problemas com a resolução dos objetos e, assim, fez com que os arquivos fossem "esvaziados" pelas etapas de geração de código. Embora desmarcar o uso de "Reutilização de tipos ..." possa parecer uma resposta, ele cria definições extras de tipos de objetos, que são proxies dos tipos reais, em um novo espaço de nome, que causa todos os tipos de problemas de "compatibilidade" com o uso desses tipos. Somente se você realmente deseja "ocultar" um tipo deve marcar esta opção.

Ocultar o tipo seria apropriado quando você não deseja que uma dependência do tipo "DLL" seja "vazada" em um projeto que você está tentando manter segregado de outro. Se a DLL do projeto de biblioteca do WCF se infiltrar nas referências do projeto do cliente, você terá esse problema com todos os tipos de efeitos colaterais estranhos, pois as definições de tipo também estão na DLL.

Grwon
fonte
0

enfrentar o mesmo problema, resolvido executando o Visual Studio no modo de administrador

Prashant
fonte
0

Encontrei esse problema ao atualizar uma solução VS2010 WCF + Silverlight no VS2015 Professional . Além de atualizar automaticamente do Silverlight 4 para o Silverlight 5, o valor da caixa de seleção de reutilização de referência de serviço foi alterado e a geração falhou.

Alexei
fonte
0

"Tipos de reutilização" nem sempre é o problema quando esse erro ocorre.

Ao adicionar uma referência a um serviço mais antigo, clique em 'avançado' e clique em 'Adicionar referência da Web'. Agora, link para seu wsdl e tudo deve estar funcionando.

FrankyHollywood
fonte
0

Se você deseja corrigir isso sem desmarcar a caixa de seleção de reutilização de montagem, é isso que funcionou para mim:

  • Remova o conjunto referenciado que você deseja reutilizar
  • Exclua toda a pasta bin do projeto
  • Atualizar referência de serviço
    • Mantenha "Reutilizar tipos em montagens referenciadas especificadas"
  • Adicione referência à montagem novamente para corrigir os erros
  • Atualizar referência de serviço novamente
popiandro
fonte
0

Reiniciar o Visual Studio fez o truque para mim. Estou usando o VS 2015.

CodificaçãoYoshi
fonte
-1

Eu tive esse problema ao tentar atualizar minha referência de serviço (o erro aparece apenas ao adicionar uma referência de serviço), mas não queria remover a caixa de seleção de reutilização de montagem.

O que funcionou para mim foi o seguinte:

  • Remover o conjunto referenciado que eu queria reutilizar
  • Atualizar referência de serviço
  • Mantenha "Reutilizar tipos em montagens referenciadas especificadas"
  • Ignore os erros, é porque a referência está faltando!
  • Adicione referência à montagem novamente para corrigir os erros
  • Atualizar referência de serviço novamente

Agora, ele atualiza e não tenta mais remover todo o meu código gerado.

Eu estava quase pronto para desistir do recurso de tipos de reutilização ...

EDIT: Certifique-se também de que a configuração da compilação seja AnyCPU ou x86, pois svcutil está com bugs com x64.

Para o downvoter: desculpe se não funcionou para você, eu nem sei por que funcionou para mim, mas funcionou. Eu posso ter feito outra coisa naquele tempo que resolveu o problema, mas não há como saber agora.

Shahin Dohan
fonte