O que significa este erro WCF: “Aviso de ferramenta personalizada: não é possível importar wsdl: portType”


85

Criei um projeto de biblioteca de serviço WCF em minha solução e tenho referências de serviço para isso. Eu uso os serviços de uma biblioteca de classes, portanto, tenho referências do meu projeto de aplicativo WPF, além da biblioteca de classes. Os serviços são configurados diretamente - alterados apenas para obter funções de serviço assíncronas.

Tudo estava funcionando bem - até que eu quis atualizar minhas referências de serviço. Ele falhou, então eu acabei revertendo e tentei novamente, mas falhou mesmo assim! Portanto, a atualização das referências de serviço falha sem fazer nenhuma alteração. Por quê?!

O erro que recebo é este:

Custom tool error: Failed to generate code for the service reference 
'MyServiceReference'.  Please check other error and warning messages for details.   

O aviso fornece mais informações:

Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: 
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in  
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the 
following types. Only matching types can be valid references: 
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']

Existem dois avisos semelhantes também dizendo:

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://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']  

E o mesmo para:

Custom tool warning: Cannot import wsdl:port .. 

Acho tudo isso confuso. Não tenho uma classe Paciente no painel do lado do cliente, exceto aquela que obtive por meio da referência de serviço. Então o que isso significa? E por que aparece de repente? Lembre-se: eu nem mudei nada!

Agora, a solução para isso foi encontrada aqui , mas sem uma explicação para o que isso significa. Então; em "Configurar referência de serviço" para o serviço, desmarco a caixa de seleção "Reutilizar tipos nos assemblies referenciados". Reconstruir agora tudo funciona bem sem problemas. Mas o que eu realmente mudei? Isso afetará meu aplicativo? E quando desmarcar isso? Eu quero reutilizar os tipos em que configurei DataContract, mas não mais. Ainda terei acesso àqueles sem essa verificação?


Ok, há uma breve explicação no msdn ( msdn.microsoft.com/en-us/library/bb628653.aspx ). Mas alguém tem uma explicação melhor? Como isso se refere aos DataContract que eu configurei?
stiank81

Respostas:


37

Quando você adiciona uma referência de serviço, há duas maneiras de manipular os tipos usados ​​pelo serviço:

  • Os tipos são armazenados em uma dll e essa dll é referenciada tanto no aplicativo cliente quanto no servidor.
  • Os tipos não estão em uma dll referenciada pelo cliente. Nesse caso, a ferramenta que cria a referência de serviço criará os tipos no arquivo reference.cs.

Muitas coisas podem dar errado. Descobrimos que, se a ferramenta travar, às vezes é mais rápido excluir a referência de serviço e iniciar novamente.

Paramos de usar referência de serviço. Para projetos onde temos controle do cliente e do serviço, usamos o método descrito neste screencast .


2
Obrigado! Na verdade, encontrei aquele screencast ontem. Assisti, e foi verdadeiramente um abrir de olhos! Estou planejando mudar para essa estrutura assim que tiver o básico no lugar. Parece que você tem lutado com alguns dos mesmos problemas que estou vendo. Muitas vezes acabo excluindo e lendo as referências de serviço quando algo estranhamente dá errado, e isso não é um bom sinal. Espero que a arquitetura descrita ajude!
stiank81

Alguém conseguiu escrever o serviço da web manualmente quando você estava usando um PollingDuplex Binding com Silverlight 5?
Richard B

157

Encontrei minha resposta aqui: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

Resumindo: Desmarquei Reutilizar tipos em assemblies de referência no menu Avançado .


Não sei se isso importa mas não estou usando MVC, mas sim Web Forms.


2
Também é necessário reiniciar o VS 2012
George Filippakos

Interessado em assistir, mas o link está morto, compartilhe se você o tiver em outro lugar
Chris

1
Funciona em um projeto MVC 3 sob VS2013 (sem reinicialização necessária).
Pawel Krakowiak

5
+1 - Apenas para referência: Para fazer essa alteração, clique com o botão direito na referência de serviço no projeto que o consome e selecione 'Configurar Referência de Serviço ...'
GrandMasterFlush

2
Nada é melhor do que "encurtar a história" :)
Ron

10

Eu também tive esse problema hoje. Levei um dia inteiro para descobrir meu erro. Espero que ajude.

Minha classe que não pôde ser importada tem uma propriedade de tipo cutom enum. Esta propriedade é marcada como DataMember e o Enum também é marcado como DataContract. Tudo bem até agora. Eu apenas esqueci de marcar cada membro enum como EnumMember.

Então eu mudei

[DataContract]
public enum SortMethodType
{
    Default = 0,
    Popularity = 1,
    ReleaseDate = 2,
    PublishedDate = 3,
    TranslatedTitle = 4,
    OriginalTitle = 5,
    UserRating = 6,
    Duration = 7
}

Para isso:

[DataContract]
public enum SortMethodType
{
    [EnumMember]
    Default = 0,
    [EnumMember]
    Popularity = 1,
    [EnumMember]
    ReleaseDate = 2,
    [EnumMember]
    PublishedDate = 3,
    [EnumMember]
    TranslatedTitle = 4,
    [EnumMember]
    OriginalTitle = 5,
    [EnumMember]
    UserRating = 6,
    [EnumMember]
    Duration = 7
}

E finalmente funcionou!


8

Vá para Propriedades avançadas enquanto adiciona a referência e remova "System.Window.Browser" da lista de verificação. Isso resolve o problema.


THX! Não usando mais referências de serviço - fazendo a abordagem manual descrita no screencast da resposta de @Shiraz. Mas é bom saber de qualquer maneira!
stiank81 de

8

isso pode parecer estranho, mas resolvi excluindo as referências, fechando o Visual Studio e reabrindo-o e, finalmente, adicionando as referências novamente.

Acho que a ferramenta personalizada precisava ser reiniciada ou algo assim.


2
mesmo se você estiver determinado a descobrir o problema SEM excluir a referência, eu recomendo fortemente que você crie um NOVO PROJETO e adicione a referência para ver se funciona. isso pode revelar um erro que você não vê em seu projeto existente ou pode simplesmente funcionar
Simon_Weaver

4

Eu constantemente encontro esse erro enquanto ele funciona em outra máquina de desenvolvedor. Embora eu seja um administrador completo em toda a minha máquina virtual, tentei fechar o Visual Studio e reabri-lo com 'Executar como administrador' e funcionou magicamente.

Boa sorte.


2

Recebi o aviso após atualizar minha solução do Visual Studio (VS) 2010 para 2013 e alterar o .NET Framework de cada projeto de 4 para 4.5.1. Fechei o VS e reabri e os avisos foram embora.


Isso me ajudou, mas eu mudei de .NET 4.5.2 para 4.6 Gaa!
Jimenemex

1

Uma desvantagem de desativar 'reutilizar tipos em assemblies referenciados' é que isso pode causar problemas com referências ambíguas. Isso ocorre porque a referência de serviço cria esses objetos novamente no arquivo .cs de referência, e seu código que implementa o serviço pode estar referenciando-os do namespace original.

Quando esse cenário ocorre, acho útil verificar os 'tipos de reutilização em assemblies referenciados especificados', o que me permite escolher apenas aqueles com referências ambíguas, o que resolve o problema rapidamente dessa forma.

Espero que isso ajude mais alguém.


0

Minhas interfaces do serviço WCF estão em um assembly, a implementação está em outro e a referência de serviço está em outro assembly, separado dos clientes da referência de serviço. Recebi a mensagem de erro logo depois de aplicar o DataContract a um enum. Depois de aplicar EnumMember aos campos do enum, o problema foi resolvido.


0

Em caso de dúvida de que seu serviço não apresenta problemas (como problemas com enums ou classes não serializáveis ​​conforme mencionado por outros), tente criar um novo projeto com uma nova referência.

Estou usando o Silverlight 5 e tentei excluir e recriar a referência várias vezes. O reference.csarquivo simplesmente ficava completamente vazio a cada vez e havia literalmente anos desde que eu o havia criado, então tentar descobrir o que havia mudado no serviço estava fora de questão.

Percebi que o erro continha referências a 2.0.5.0. Agora eu nem sei se isso é realmente relevante para a versão do Silverlight, mas me fez pensar em apenas criar um novo projeto e de repente tudo funcionou.

Aviso 2 Aviso de ferramenta personalizada: Não é possível importar wsdl: portType Detalhe: uma exceção foi lançada durante a execução de uma extensão de importação WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Erro: Não foi possível carregar o arquivo ou assembly 'System.Xml, Versão = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e 'ou uma de suas dependências. O sistema não pode encontrar o arquivo especificado. XPath para fonte de erro: // wsdl: settings [@targetNamespace = ''] / wsdl: port Type [@ name = 'IShoppingCart']


0

Eu estava examinando meu projeto e estava tendo o mesmo problema. Descobriu-se que havia diferentes versões da mesma DLL no WCF vs. Site. O site da Web tinha uma versão mais recente da DLL e o serviço fazia referência a uma versão mais antiga da DLL. Depois de sincronizados, tudo funcionou bem.


0

Eu experimentei o mesmo erro. Lutei por quase um dia tentando descobrir o que estava errado. A pista para mim foram os avisos que VS estava lançando. Ele estava tentando fazer algum tipo de mapeamento para Yahoo.Yui.Compressor.dll, uma biblioteca que eu adicionei e removi (porque decidi não usá-la) alguns dias antes. Foi chocante porque a biblioteca não estava lá, mas de alguma forma ela estava tentando fazer referência a ela.

Por fim, restauro essa dll da Lixeira e posso atualizar minha referência de serviço com êxito.


0

Para qualquer pessoa aqui no futuro, tive o mesmo erro, mas causado por problemas de versão, de duas maneiras diferentes.

Tenho dois serviços WCF e dois aplicativos cliente que se comunicam por meio das referências de serviço. Atualizei um pacote nuget em ambos os lados e tentei atualizar a referência de serviço e recebi este erro.

Excluir não ajudou. Desmarcar "reutilizar assemblies" não é desejável, pois preciso reutilizá-los - esse é o ponto principal.

No final, houve dois problemas distintos:

1) O primeiro problema, acredito, foi um problema de cache do estúdio visual. Revisei meticulosamente todas as referências e não encontrei nenhum problema, mas ainda assim, não consegui encontrar a versão anterior do arquivo. Desinstalei todos os pacotes nuget, reiniciei o Visual Studio e reinstalei-os. A atualização da referência de serviço funcionou.

2) O segundo problema foi causado por um problema de dependência. Atualizei o pacote nuget em ambos os lados e tudo parecia correto, mas uma dependência não marcada estava fora de sincronia. Exemplo:

O pacote Foo v1 faz referência à barra v1. É possível atualizar Foo e Bar para v2 independentemente sem atualizar a referência. Se você instalar Foo e Bar v2, a ferramenta de referência de serviço fará a varredura de Foo v2, consulte a referência de Bar v1 e falhará porque não consegue encontrar a versão mais antiga. Isso só é relatado corretamente se você atualizar os números de versão de sua dll para cada pacote. O Visual Studio e o MSBuild não terão problemas para criar o aplicativo, mas a referência de serviço terá muita dificuldade para tentar resolver tudo.

Espero que isso ajude alguém.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.