O nome do tipo ‘X’ não existe no tipo ‘YX’

Este parece ser um problema antigo na internet, mas me afetou recentemente …

Criei um serviço WCF em um projeto .NET (Projeto A). Em outro projeto (Projeto B) na mesma solução, tentei adicionar uma referência de serviço ao referido serviço WCF. Tudo estava legal e a galera até que tentei construir o Projeto B. Recebi vários erros dizendo “O nome do tipo ‘X’ não existe no tipo ‘Y.X'” no arquivo Reference.cs.

Uma olhada no arquivo Reference.cs mostrou que o namespace para o Projeto B foi anexado ao namespace que especifiquei ao criar a referência de serviço. Portanto, é claro que o Visual Studio não seria capaz de encontrar o tipo, porque ele está procurando no namespace errado. Fiz algumas pesquisas no Google e encontrei esta pergunta útil sobre stackoverflow:

http://stackoverflow.com/questions/1200346/wcf-service-reference-namespace-differs-from-original

Resumindo, você precisa especificar um URI como um namespace no contrato de dados do serviço. Se você não fizer isso, o .NET apenas acrescentará o namespace do projeto onde a referência de serviço está sendo criada. De acordo com a principal resposta a essa questão stackoverflow, você precisa atualizar o arquivo svcmap no projeto B depois de criar a referência para que mapeie o namespace URI para um namespace CLR assim:

<NamespaceMappings>
<NamespaceMapping
TargetNamespace="http://foo.com/ServiceReference.X"
ClrNamespace="foo.X" />
</NamespaceMappings>

Agora é só atualizar a referência de serviço e você deve estar no mercado.

O que me incomoda é: por que preciso passar por esses obstáculos para adicionar uma referência de serviço? Ter que adicionar um namespace ao contrato de dados é bom, mas eu não deveria ter que atualizar manualmente meu arquivo svcmap.