Página 1 de 2

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 21 Out 2019 08:35
por cMach
Bom dia Pessoal,
Sou novo no harbour e estou com uma dúvida que talvez vcs possam me ajudar.
Estou tentando enviar arquivo no formato "Txt" via requisição http. Meu programa gera o arquivo no formato texto e joga pra memoria utilizando o MemoRead. Em seguida, crio um objeto MSXML2.ServerXMLHTTP para funcionar com uma API para conexão com o destinatário. A conexão está sendo estabelecida, mas apresenta o seguinte erro:

Description .......: DISP_E_MEMBERNOTFOUND
Operation .........: SEND

Segue parte do codigo :

var = MemoRead(file) //o file é um arquivo texto
oServer:=CreateObject( "MSXML2.ServerXMLHTTP")
oServer:Open( "POST", 'aqui o endereço http de destino...' , .f. )
oServer:setRequestHeader( "cabeçalho" , "text/txt" )
oServer:Send(var)

grato.

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 21 Out 2019 11:09
por JoséQuintas
cMach escreveu:Sou novo no harbour e estou com uma dúvida que talvez vcs possam me ajudar.
Vamos começar pelo seguinte, há 4 variações da "linguagem":

- Harbour 3.0 - a distribuição oficial parou no 3.0, muitos se confundem e começam por essa
- Harbour 3.2 - é o oficial, talvez o mais usado
- Harbour 3.4 - é uma distribuição que se separou do 3.2, contém algumas diferenças com relação ao 3.2
- XHarbour - é uma distribuição que se separou há muito tempo do Harbour, e seguiu caminho diferente

O erro que mencionou já apareceu por aqui, mas no XHarbour, e pela mensagem de erro parece ser ele mesmo.
No XHarbour há uma diferença ao usar o CreateObject(), conforme o conjunto de ferramentas que se usa junto com ele.

Eu não uso XHarbour, mas pelo que já comentaram por aqui, é substituir o CreateObject() por outra função.

Basicamente, ao usar oServer := CreateObject( "MSXML2.ServerXMLHTP" ), o vínculo não foi criado corretamente.
E ao tentar usar o objeto oServer, não encontrou o método Send() que deveria fazer parte dele.
Pode ser a exigência de versão "MSXML2.ServerXMLHTTP.6.0"

Também pode ser a necessidade de usar xhb_CreateObject() que está neste fonte
https://github.com/JoseQuintas/sefazcla ... object.prg

Como eu disse, eu NÃO uso XHarbour, pode testar o uso desta função ou aguardar a confirmação de alguém que use XHarbour e esteja mais familiarizado com isso.

Se está apenas começando, pode pensar na alternativa de usar o Harbour 3.2 ou 3.4.
Mas se seus fontes já tem dependência com XHarbour, pode ser mais viável apenas contornar esse problema e continuar com ele.

Comece testando a indicação de versão: "MSXML2.ServerXMLHTTP.6.0" ou "MSXML2.ServerXMLHTTP.5.0"
Depois o uso do fonte que mencionei.

Pode ser interessante também passar mais detalhes sobre o que está usando, se é apenas XHarbour, se é um download que veio com XHarbour junto, etc. assim quem usa igual pode dar uma ajuda mais direcionada ao seu conjunto de desenvolvimento.
É que isso pode ser diferente no Harbour, XHarbour, XHarbour com Fivewin, XHarbour com HMG, etc. por isso acaba precisando mais detalhes.

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 21 Out 2019 11:16
por cMach
Olá José, A versão que utilizo aqui é o xHarbour.
Vou dar uma olhada no link que colocou e já posto o resultado.
Desde já agradeço.

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 21 Out 2019 12:11
por cMach
Olá,
Comece testando a indicação de versão:

"MSXML2.ServerXMLHTTP.6.0"
Mesmo erro...SEND - DISP_E_MEMBERNOTFOUND

"MSXML2.ServerXMLHTTP.5.0"
Operation .........: TOLEAUTO:NEW
[ 1] = Type: C Val: MSXML2.ServerXMLHTTP.5.0 [ 2] = Type: U [ 3] = Type: U

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 21 Out 2019 16:38
por Kapiaba
Tente assim:

Código: Selecionar todos

FUNCTION Van_Server()

   LOCAL oServer

   //1) Criar o servidor
   #ifdef __XHARBOUR__  // xHarbour

      Try
         oServer := CreateObject( "MSXML2.ServerXMLHTTP.6.0" )
      Catch
         MsgInfo( 'Erro na Criação do Serviço' )
         RETURN NIL
      End

   #else  // Harbour

      Try
         oServer := win_OleCreateObject( "MSXML2.ServerXMLHTTP.5.0" )
      Catch
         MsgInfo( 'Erro na Criação do Serviço!', 'Atenção!' )
         RETURN NIL
      End

   #endif

   Try

      //2) Abrir o servidor
      oServer:Open( "POST", cWebService, .F. )             

      //3) Adicionar o request header
      oServer:SetRequestHeader("Content-Type","application/json")
      oServer:SetRequestHeader( "Username" , "&sUser")
      oServer:SetRequestHeader( "Password" , "&sPassword")

      oServer:Send()

      oServer:WaitForResponse( 10000 )

   Catch

      MsgInfo( 'Erro na conexão com o site!', 'Atenção!' )


   End

   // continua

RETURN Nil
Saudações.

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 21 Out 2019 17:20
por cMach
Kapiaba,
Tentei da forma que voce enviou, alterando apenas o SEND() pois preciso enviar nele o arquivo texto.
Assim eu jogo para memoria com o memoread e envio no send.

arquivo = MemoRead(arq_txt)
..
send(arquivo)

Mas ainda ocorre o mesmo erro :
Description .......: DISP_E_MEMBERNOTFOUND
Operation .........: SEND

grato,

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 22 Out 2019 09:30
por JoséQuintas
Kapiaba

Se não me engano você usa Fivewin

Consegue identificar se é o Fivewin que contém essa função corrigida, ou se é o XHarbour do Fivewin que está corrigido?

Talvez compilar com -p pra gerar o .ppo e ver no fonte se é o CreateObject(), ou se está direcionando pra outra função, seria um começo.

Dependendo do resultado, pode ser interessante distribuir o XHarbour do Fivewin - sem o Fivewin não seria pirataria.

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 22 Out 2019 10:23
por Kapiaba
.PPO gerado pelo xHarbour.

Código: Selecionar todos

FUNCTION _XmlQuery()

   LOCAL cURL := "https://www.google.com", ;
         cSaveAs := "c:\winapps\onasset\xml\inbox\",  lPass := .F.,  ;
         oProg := 0, oHttpSend2 := "", oHttp2, cHttpSend3 := "",     ;
         oHttp3,  cWinR, cWinResp := "", cTokenId := "",             ;
         cDateFrom := "", cDateTo := "", aTokenResponse := {}, nUpdate := 0

   cSaveAs += DTOS( DATE() ) + LEFT( TIME(), 2 ) + SUBSTR( TIME(), 4, 2 ) + RIGHT( TIME(), 2 ) + ".XML"

   Try
      oHttp2 := CreateObject( "MSXML2.ServerXMLHTTP.6.0" )
   Catch
      MsgInfo( "Erro na Criação do Serviço" )
      RETURN .F.
   End


   TRY
      oHttp2:Open( "POST", cURL, .F. )
      oHttp2:SetRequestHeader( "Content-Type", "application/json" )
      cHttpSend2 := "grant_type=client_credentials&client_id=x&client_secret=x"
      oHttp2:Send( cHttpSend2 )
      Sysrefresh()
      cWinResp := oHttp2:ResponseBody


      nPos   := AT( "ACCESS_TOKEN", UPPER( cWinResp ) )
      lStart := .F.

      FOR nX0 = nPos TO LEN( cWinResp )
         cChar := SUBSTR( cWinResp, nX0, 1 )
         IF cChar == ":"
            lStart := .T.
         ELSE
            IF cChar == ","
               EXIT
            ELSE
               IF lStart .AND. ( ! EMPTY( cChar ) )
                  IF cChar <> CHR( 34 )
                     cTokenId += cChar
                  ENDIF
               ENDIF
            ENDIF
         ENDIF

      NEXT


      cDate0    := DTOS( DATE() - 1 )
      cDate1    := DTOS( DATE() )
      nTime1    := VAL( LEFT( TIME(),2 ) ) - 23

      IF ( nTime1 < 1 )
         nTime1 := 0
      ENDIF

      cTime1    := RIGHT( "00" + LTRIM( STR(nTime1,9 ) ), 2 ) + SUBSTR( TIME(), 3 )
      cTime2    := TIME()
      cDateFrom := LEFT( cDate0, 4 ) + "-" + SUBSTR( cDate0, 5, 2 ) + "-" + RIGHT( cDate0, 2 ) + "T" + cTime1 + "Z"
      cDateTo   := LEFT( cDate1, 4 ) + "-" + SUBSTR( cDate1, 5, 2 ) + "-" + RIGHT( cDate1, 2 ) + "T" + cTime2 + "Z"
      cURL      := "https://xxx.com/yyy/1/zzz/000/devicereports?from=" + cDateFrom + "&to=" + cDateTo + "&page=1&pageSize=500"

   CATCH
      DbCloseAll()
      __Quit()
   END

   oHttp2 := NIL

   Try
      oHttp3 := CreateObject( "MSXML2.ServerXMLHTTP.6.0" )
   Catch
      MsgInfo( "Erro na Criação do Serviço" )
      RETURN .F.
   End

   oHttp3:Open( "GET", cURL, .F. )
   oHttp3:SetRequestHeader( "Content-Type", "application/json" )
   oHttp3:SetRequestHeader( "Authorization", "Bearer " + cTokenId )

   Sysrefresh()

   oHttp3 := NIL

RETURN ( nUpdate )

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 22 Out 2019 11:30
por JoséQuintas
A função é a mesma.
Só falta saber de que LIB ela vém.
Se for do XHarbour, significaria que o XHarbour do Fivewin está corrigido diferente dos demais.

Não sei se dá pra testar fácil, adicionando só o que faz parte do XHarbour pra ver se está ok, e adicionando uma LIB por vez pra ver se vém de outro lugar.

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 22 Out 2019 11:40
por Kapiaba
Uso o xHarbour e o BCC74, daqui:

http://www.xharbour.org/

Abs

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 22 Out 2019 11:44
por cMach
bom dia Colegas!

Mudei o CreateObject("Microsoft.XmlHttp") e o erro o DISP_E_MEMBERNOTFOUND parou.
Tanto o MSXML2.ServerXMLHTTP, quanto o MSXML2.ServerXMLHTTP.6.0 apresentavam o mesmo erro.
vou testar agora porq não tá trazendo retorno.
valeu pessoal

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 22 Out 2019 14:13
por JoséQuintas
cMach escreveu:Mudei o CreateObject("Microsoft.XmlHttp") e o erro o DISP_E_MEMBERNOTFOUND parou.
Alterando maiúsculas/minúsculas? XmlHttp
Agora confundiu mais ainda.
Ficou diferente de tudo que existe.

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 22 Out 2019 14:24
por JoséQuintas
Existem algumas variações do componente:

MSXML2.XMLHTTP
Microsoft.XMLHTTP
MSXML2.ServerXMLHTP

Não me pergunte qual a diferença entre eles.
Mas em todos os manuais da Microsoft, todos aparecem como maiúscula a parte XMLHTTP.

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 22 Out 2019 14:25
por Kapiaba
Veja se ajuda:

Código: Selecionar todos

#include "fivewin.ch"
#include "dbcombo.ch"
#include "directry.ch"
#include "common.ch"
#include "hbclass.ch"
#include "objects.ch"
#include "hbxml.ch"
#include "hbcompat.ch"
#include "fileio.ch"

#define _MSXML2_DOMDocument          'MSXML2.DOMDocument.5.0'
#define _MSXML2_MXDigitalSignature   'MSXML2.MXDigitalSignature.5.0'
#define _MSXML2_XMLSchemaCache       'MSXML2.XMLSchemaCache.5.0'
#define _MSXML2_ServerXMLHTTP        'MSXML2.ServerXMLHTTP.5.0'

#define PROV_RSA_FULL           1
#define PROV_RSA_SIG            2
#define PROV_DSS                3
#define PROV_FORTEZZA           4
#define PROV_MS_EXCHANGE        5
#define PROV_SSL                6
#define PROV_RSA_SCHANNEL       12
#define PROV_DSS_DH             13
#define PROV_EC_ECDSA_SIG       14
#define PROV_EC_ECNRA_SIG       15
#define PROV_EC_ECDSA_FULL      16
#define PROV_EC_ECNRA_FULL      17
#define PROV_DH_SCHANNEL        18
#define PROV_SPYRUS_LYNKS       20
#define PROV_RNG                21
#define PROV_INTEL_SEC          22
#define PROV_REPLACE_OWF        23
#define PROV_RSA_AES            24

// Capicom store names
#define _CAPICOM_MEMORY_STORE                         0
#define _CAPICOM_LOCAL_MACHINE_STORE                  1
#define _CAPICOM_CURRENT_USER_STORE                   2
#define _CAPICOM_ACTIVE_DIRECTORY_USER_STORE          3
#define _CAPICOM_SMART_CARD_USER_STORE                4
 
// Capicom store open mode
#define _CAPICOM_STORE_OPEN_READ_ONLY                 0           // Abre repositorio do windows em modo leitura
#define _CAPICOM_STORE_OPEN_READ_WRITE                1
#define _CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED           2
#define _CAPICOM_STORE_OPEN_EXISTING_ONLY             128
#define _CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED          256

// Capicom certificates find type enums
#define _CAPICOM_CERTIFICATE_FIND_SHA1_HASH           0
#define _CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME        1
#define _CAPICOM_CERTIFICATE_FIND_ISSUER_NAME         2
#define _CAPICOM_CERTIFICATE_FIND_ROOT_NAME           3
#define _CAPICOM_CERTIFICATE_FIND_TEMPLATE_NAME       4
#define _CAPICOM_CERTIFICATE_FIND_EXTENSION           5
#define _CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY   6
#define _CAPICOM_CERTIFICATE_FIND_APPLICATION_POLICY  7
#define _CAPICOM_CERTIFICATE_FIND_CERTIFICATE_POLICY  8
#define _CAPICOM_CERTIFICATE_FIND_TIME_VALID          9
#define _CAPICOM_CERTIFICATE_FIND_TIME_NOT_YET_VALID  10
#define _CAPICOM_CERTIFICATE_FIND_TIME_EXPIRED        11
#define _CAPICOM_CERTIFICATE_FIND_KEY_USAGE           12

#define _CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE          0x00000080  // Permitir o uso da Chave Privada para assinatura Digital
#define _CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME 0           // Este atributo contém o tempo em que a assinatura foi criada.
#define _CAPICOM_INFO_SUBJECT_SIMPLE_NAME             0           // Retorna o nome de exibição do certificado.
#define _CAPICOM_ENCODE_BASE64                        0           // Os dados são guardados como uma string base64-codificado.
#define _CAPICOM_E_CANCELLED                          -2138568446 // A operação foi cancelada pelo usuário.
#define _CAPICOM_E_STORE_EMPTY                        -2138570191 // Enum que indica se o repositorio esta vazio
#define _CERT_KEY_SPEC_PROP_ID                        6
#define _CAPICOM_CERT_INFO_ISSUER_EMAIL_NAME          0
#define _SIG_KEYINFO                                  0 // 0 - NOKEYINFO ; 1- KEYVALUE ; 2- CERTIFICATES ; 4- PURGE
#define _CAPICOM_HASH_ALGORITHM_SHA1                  0 // algoritmo de criptografia SHA-1
#define DC_CALL_STD  0x0020


STATIC pastaEnv, pastaRet, pastaXSD, cXML, cFileName, cCertCN, oServerWS
STATIC cUrl, cSoapAct, bOleInitialized := .F.

FUNCTION EnviarConsulta( oRec )

   LOCAL cXml, cSoapAction, cWebservice, cOperation, cRetorno, cxlido
   LOCAL oXML

   cWebservice := "https://webservices.producaorestrita.esocial.gov.br/servicos/empregador/consultarloteeventos/WsConsultarLoteEventos.svc"
   cSoapAction := "http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/consulta/retornoProcessamento/v1_1_0/ServicoConsultarLoteEventos/ConsultarLoteEventos"
   cOperation  := "ConsultarLoteEventos"
	 
   cXml := '<eSocial xmlns="http://www.esocial.gov.br/schema/lote/eventos/envio/consulta/retornoProcessamento/v1_0_0">'
   cXml += '<consultaLoteEventos>'
   cXml += '<protocoloEnvio>1.2.201707.0000000000000056672</protocoloEnvio>'
   cXml += '</consultaLoteEventos>'
   cXml += '</eSocial>'
	  
   cXml := SoapEnvelope( cXml, cOperation ) //
	 
   oXML := TXMLDocument():New( cXml, HBXML_STYLE_NOESCAPE )
	 
   IF oXML:nError != HBXML_ERROR_NONE
      MsgAlert( "xml com problema " + Str( oXML:nError ) )
   ENDIF
	 
   cRetorno := MicrosoftXmlSoapPost( cXml, cSoapAction, cWebservice )

   MemoWrit( '.\retorno.xml', cRetorno )
	    
   MsgAlert( cRetorno )
	 
RETURN Nil
	 
FUNCTION MicrosoftXmlSoapPost( cXmlSoap, cSoapAction, cWebService )

   LOCAL oServer, oDOMDoc, oError
   LOCAL nCont
   LOCAL cRetorno := "*ERRO*", cXmlRetorno := ""
	 
   oServer := CreateObject( "MSXML2.ServerXMLHTTP" )
   oServer:Open( "POST", cWebService, .F. )
   oServer:SetRequestHeader( "SOAPAction", cSoapAction )
   oServer:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )
	 
   oDOMDoc = CREATEOBJECT( "MSXML2.DOMDocument" )
	 
   oDOMDoc:async = .F.
   oDOMDoc:validateOnParse  = .T.
   oDOMDoc:resolveExternals := .F.
   oDOMDoc:preserveWhiteSpace = .T.
   oDOMDoc:LoadXML( cXmlSoap )

   IF oDOMDoc:parseError:errorCode <> 0
      MsgAlert( 'Erro: xML nao carregado' + CRLF + 'Erro: ' + ToString( oDOMDoc:parseError:Reason ) + ' Posição: ' + ToString( oDOMDoc:parseError:linepos ) )
      RETURN Nil
   ENDIF

   TRY
      oServer:send( oDOMDoc:xml )
   CATCH oError
      MsgAlert( 'Falha no envio do xML' )
      RETURN Nil
   END

   cRetorno := oServer:responseText
	 
   IF ValType( cRetorno ) == "C"
      cXmlRetorno := cRetorno
   ELSEIF cRetorno == NIL
      cXmlRetorno := "*ERRO*"
   ELSE
      cXmlRetorno := ""
      FOR nCont = 1 TO Len( cRetorno )
         cXmlRetorno += Chr( cRetorno[ nCont ] )
      NEXT
   ENDIF

RETURN cXmlRetorno
	 
FUNCTION ToString( xValue )

   RETURN iif( xValue == NIL, "", xValue )
	 
FUNCTION SoapEnvelope( cXml, cOperation )

   LOCAL cXmlEnvelope

   cMethod := "ConsultarLoteEventos"
   cXmlEnvelope := '<?xml version="1.0" encoding="utf-8"?>'
   cXmlEnvelope += '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">'
   cXmlEnvelope += '<soap:Header/>'
   cXmlEnvelope += '<soap:Body>'
   cXmlEnvelope +=   cXml
   cXmlEnvelope += '</soap:Body>'
   cXmlEnvelope += '</soap:Envelope>'

   MemoWrit( '.\vai.xml', cXmlEnvelope )
	
RETURN cXmlEnvelope
	 
FUNCTION XmlTag( cNome, cConteudo )

   IF Empty( cConteudo )
      RETURN "<" + cNome + " />"
   ENDIF

RETURN "<" + cNome + ">" + cConteudo + "</" + cNome + ">"

SEND - DISP_E_MEMBERNOTFOUND

Enviado: 22 Out 2019 20:56
por JoséQuintas
Kapiaba escreveu:Veja se ajuda:
Pelo contrário, pode complicar mais ainda.
O Windows tem o XML 3.0, 4.0 e.... 6.0
A versão 5.0, que usamos pra nota eletrônica, só saiu com o Office, e não tem no Windows a não ser que seja instalada.

Código: Selecionar todos

MSXML2.ServerXMLHTTP.5.0
Esse daí dependeria de ter instalado o XML 5.0

Pra testes de uso geral, melhor testar com o 6.0
Ou, se possível, sem número de versão, para que seja selecionado automático conforme a necessidade.

Sobre aqueles outros componentes variados...

https://pt.switch-case.com/51019024
xmlhttp.png
Ele dá uma explicação técnica de problemas... e garante que é pra usar... o que ele teve problemas.
Só rindo mesmo....
Foi-se o tempo que internet resolvia dúvidas... agora parece que elas só aumentam.