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?
fonte
Respostas:
Quando você adiciona uma referência de serviço, há duas maneiras de manipular os tipos usados pelo serviço:
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 .
fonte
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.
fonte
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!
fonte
Vá para Propriedades avançadas enquanto adiciona a referência e remova "System.Window.Browser" da lista de verificação. Isso resolve o problema.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.cs
arquivo 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.
fonte
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.
fonte
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.
fonte
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.
fonte