Erro: Mensagem de erro "InvalidOperationException" ocorre quando você consumir um serviço da Web com um parâmetro de saída

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 815211
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Você pode usar Visual translation from VPE for Csharp .NET para criar um serviço da Web que tem um método de Serviço da Web com um parâmetro out . O parâmetro out pode aparecer antes do parâmetro de entrada ou o parâmetro ref . Você deve especificar o SoapRpcMethodAttribute para o método de Serviço da Web para preservar a ordem dos parâmetros. O problema ocorre quando você subseqüentemente usar este serviço da Web que você criou na translation from VPE for Csharp Visual .NET em um aplicativo Visual Basic. NET. Você receberá a seguinte mensagem de erro quando você chamar o método de Serviço da Web .

Ocorreu uma exceção sem tratamento do tipo 'System.InvalidOperationException' na system.xml.dll

Obter informações adicionais: Houve um erro ao gerar o XML documento.

Causa
Se o método de Serviço da Web tem um parâmetro out e gerar o proxy usando o Visual Basic. NET, o parâmetro out será gerado como um parâmetro ByRef . Isso ocorre porque o Visual Basic .NET não dá suporte sem parâmetros. O código de reflexão não é possível diferenciar entre um parâmetro ByRef real e um parâmetro ByRef que corresponde a um parâmetro out . Na classe proxy, a chamada real para o serviço da Web é concluída, usando o método Invoke . Na chamada do método Invoke , o parâmetro de saída está faltando. No entanto, o serializador gerado espera o parâmetro. Portanto, você recebe o erro.
Resolução
Para resolver esse problema, você pode passar alguns valores fictícios para os parâmetros ByRef que correspondem aos parâmetros de saída. Você pode fazer isso no método Invoke de classe de proxy de serviço da Web. Para fazer isso, execute as seguintes etapas:
  1. Abra o código para o arquivo de proxy de serviço da Web no Visual Studio. NET. Ou, você pode usar um editor de texto, como o bloco de notas.

    A Web arquivo proxy de serviço está localizado na pasta referências da Web no diretório de aplicativo Web.
  2. Localize o método de Serviço da Web . Adicione os valores padrão para os parâmetros ByRef faltando os parâmetros para o método Invoke .

    Por exemplo, você pode modificar o arquivo de proxy que é usado no código de exemplo da seguinte maneira:
            <System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/SayHelloWorld", RequestNamespace:="http://tempuri.org/", ResponseNamespace:="http://tempuri.org/")>  _        Public Function SayHelloWorld(ByRef sOutParam As String, ByVal iParam As Integer) As String         Dim results() As Object = Me.Invoke("SayHelloWorld", New Object() {Nothing, iParam})            sOutParam = CType(results(1),String)            Return CType(results(0),String)        End Function
    Observação os parâmetros do método Invoke , você deve inicializar a matriz de objeto com { Nothing , iParam}, em vez de apenas {iParam}.
Situação
A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados no começo deste artigo.
Mais Informações

Etapas para reproduzir o problema

  1. Crie um novo aplicativo de serviço da Web do ASP.NET. Usar Visual translation from VPE for Csharp .NET para criar o aplicativo. Nome do aplicativo de serviço da Web HelloWorld .
  2. No Microsoft Solution Explorer, clique com o botão direito do mouse em Service1.asmx e, em seguida, clique em View Code .
  3. Adicione o seguinte método Web Service para o serviço da Web:
          [WebMethod, System.Web.Services.Protocols.SoapRpcMethod]      public string SayHelloWorld(out string sOutParam, int iParam)      {         sOutParam = iParam.ToString();         return "Hello World";      }
  4. No menu Debug , clique em Iniciar .

    Observe o URL para o serviço da Web.
  5. Crie um novo projeto de aplicativo de console Visual Basic.NET.
  6. No Solution Explorer, clique com o botão direito do mouse em References e clique em Add Web References .
  7. Adicione o seguinte código ao método Main :
          Dim obj As New localhost.Service1()      Dim sOut, sResult As String      sResult = obj.SayHelloWorld(sOut, 10)      Console.WriteLine(sOut)
  8. No menu Debug , clique em Iniciar para executar o aplicativo.

    Você receberá a mensagem de erro na seção "Sintomas".
Referências
Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
309013COMO: Criar e testar um serviço XML da Web no Visual Basic .NET

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 815211 - Última Revisão: 12/08/2015 02:07:34 - Revisão: 1.5

Microsoft Web Services (included with the .NET Framework) 1.0, Microsoft Web Services Enhancements para Microsoft .NET 1.1, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition

  • kbnosurvey kbarchive kbmt kbvs2002sp1sweep kbxml kbjit kbdev kbclientprotocols kbproxydev kbinetdev kbnamespace kbprogramming kbbug KB815211 KbMtpt
Comentários