it-swarm-pt.tech

Erro wsdl.exe: Não foi possível importar a ligação '...' do espaço para nome '...'

Ao executar o wsdl.exe em um WSDL que criei, recebo este erro:

Erro: não foi possível importar a ligação 'SomeBinding' do espaço de nomes 'SomeNS'.

  • Não foi possível importar a operação 'someOperation'.
  • Esses membros não podem ser derivados.

Estou usando o estilo literal do documento e, pelo que sei, estou seguindo todas as regras.

Para resumir, eu tenho um WSDL válido, mas a ferramenta não gosta.

O que estou procurando é se alguém tiver muita experiência com a ferramenta wsdl.exe e souber de alguma coisa secreta que eu não conheço.

31
Glenn Moss

Me deparei com a mesma mensagem de erro. Depois de cavar por um tempo, descobrimos que é possível fornecer arquivos xsd além do arquivo wsdl. Arquivos .xsd incluídos/importados, além de .wsdl no final do comando wsdl, da seguinte maneira:

wsdl.exe myWebService.wsdl myXsd1.xsd myType1.xsd myXsd2.xsd ...

O WSDL emitiu alguns avisos, mas criou uma interface de serviço aceitável.

51
thehhv

às vezes você tem que mudar seu código. os nomes das partes da mensagem não devem ser os mesmos;)

<wsdl:message name="AnfrageRisikoAnfrageL">
    <wsdl:part name="parameters" element="his1_0:typeIn"/>
</wsdl:message>
<wsdl:message name="AnfrageRisikoAntwortL">
    <wsdl:part name="parameters" element="his1_0:typeOut"/>
</wsdl:message>

para isso:

<wsdl:message name="AnfrageRisikoAnfrageL">
    <wsdl:part name="in" element="his1_0:typeIn"/>
</wsdl:message>
<wsdl:message name="AnfrageRisikoAntwortL">
    <wsdl:part name="out" element="his1_0:typeOut"/>
</wsdl:message>
8
mo.

A solução @thehhv está correta. Existe uma solução alternativa que não exige que você adicione xsds manualmente.

Vá para o seu serviço e, em vez de ?wsdl, Vá para ?singleWsdl (Captura de tela abaixo)

enter image description here

então salve a página como arquivo .wsdl (ele oferecerá .svc, altere-o)

em seguida, abra Visual studio command Prompt, você pode encontrá-lo em (Win 7) Iniciar -> Todos os programas -> Visual studio 2013 -> Ferramentas do Visual Studio -> VS2013 x64 Native Tools Prompt de comando das ferramentas (poderia ser algo semelhante)
Em seguida, execute o seguinte comando em Visual studio command Prompt (Onde em vez de C:\WebPricingService.wsdl é onde você salvou seu wsdl, a menos que aconteça que pensemos da mesma forma e escolhemos o mesmo nome de arquivo e local que é preocupante)

wsdl.exe C:\WebPricingService.wsdl

Deverá fornecer alguns avisos, como @thehhv disse, mas ainda assim gerar o cliente em C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\AMD64\WebPricingService.cs (ou onde quer que ele seja colocado em sua máquina - verifique a saída do console onde se lê 'Writing file')

enter image description here

Espero que isso poupe algum tempo.

4
Matas Vaitkevicius

No meu caso, o problema era diferente e está bem descrito aqui :

Sempre que o nome de uma peça é "parâmetros" .Net assume que doc/lit/wrap é usado e gera o proxy de acordo. Se mesmo que o "parâmetro" do Word seja usado, o wsdl não é doc/lit/wrap (como no último exemplo). O Net pode nos dar algum erro. Qual erro? Você adivinhou corretamente: "Esses membros não podem ser derivados". Agora podemos entender o que significa o erro: .Net tenta omitir o elemento raiz, pois acredita que doc/lit/wrap é usado. No entanto, esse elemento não pode ser removido porque não é fictício - ele deve ser escolhido ativamente pelo usuário dentre alguns tipos derivados.

A correção é a seguinte e funcionou perfeitamente para mim:

A maneira de corrigi-lo é abrir o wsdl em um editor de texto e alterar o nome da peça de "parameters" para "parâmetros1" . Agora .Net saberá gerar um proxy doc/lit/bare. Isso significa que uma nova classe de wrapper aparecerá como o parâmetro raiz no proxy. Embora isso possa ser um pouco da API mais entediante, isso não afetará o formato da conexão e o proxy é totalmente interoperável.

(ênfase por mim)

3
BartoszKP

Caso esteja fazendo isso com o UPS Shipping wsdl e deseje trocar os URLs dev para prod quando estiver criando para diferentes regiões (depuração, dev, prod) etc. Você usaria o comando abaixo para gerar um arquivo vb ou C # a partir do Ship.wsdl e, em seguida, substitua os valores nesse arquivo Ship.vb.

WSDL /Language:VB /out:"C:\wsdl\Ship.vb" "C:\wsdl\Ship.wsdl"  C:\wsdl\UPSSecurity.xsd  C:\wsdl\ShipWebServiceSchema.xsd  C:\wsdl\IFWS.xsd  C:\wsdl\common.xsd
0
user2242618

Caso alguém atinja esse muro, eis o que causou o erro no meu caso:

Eu tenho uma operação:

<wsdl:operation name="FormatReport">
  <wsdl:documentation>Runs a report, which is returned as the response</wsdl:documentation>
  <wsdl:input message="FormatReportRequest" />
  <wsdl:output message="FormatReportResponse" />
</wsdl:operation>

que recebe uma entrada:

<wsdl:message name="FormatReportRequest">
  <wsdl:part name="parameters" element="reporting:FormatReportInput" />
</wsdl:message>

e outra operação:

<wsdl:operation name="FormatReportAsync">
  <wsdl:documentation>Creates and submits an Async Report Job to be executed asynchronously by the Async Report Windows Service.</wsdl:documentation>
  <wsdl:input message="FormatReportAsyncRequest" />
  <wsdl:output message="FormatReportAsyncResponse" />
</wsdl:operation>

recebendo uma entrada:

  <wsdl:message name="FormatReportAsyncRequest">
    <wsdl:part name="parameters" element="reporting:FormatReportInputAsync" />
  </wsdl:message>

E os elementos de entrada são instâncias de dois tipos:

<xsd:element name="FormatReportInput" type="reporting:FormatReportInputType"/>
<xsd:element name="FormatReportInputAsync" type="reporting:FormatReportAsyncInputType"/>

Aqui está o problema - o reporting:FormatReportAsyncInputType type estende (deriva de) o reporting:FormatReportInputType tipo. Isso é o que parece confundir a ferramenta e fazer com que "Esses membros não possam ser derivados". erro. Você pode seguir essa sugestão na resposta aceita.

0
Alex Sk