[RESOLVIDO] Timeout dll windows

Discussão em 'EMS , HCM e Totvs 11' iniciado por cintiasottelli, Novembro 27, 2015.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. cintiasottelli

    cintiasottelli Membro Participativo

    Caros,

    Bom dia!

    Estou com um problema de timeout... Hoje temos uma url que gera um arquivo pfd através do progress e pela chamada acredito que esteja dando timeout pois me é retornado um arquivo 0kb mas continua processando no C# e la diz que o arquivo foi concluido com sucesso.

    Alguem saberia me ajudar?

    Abaixo o codigo que estamos usando

    Código:
    PROCEDURE ShellExecuteA EXTERNAL "Shell32.dll":
      DEFINE INPUT PARAMETER HWND AS LONG.
      DEFINE INPUT PARAMETER lpOperation  AS CHARACTER.
      DEFINE INPUT PARAMETER lpFile       AS CHARACTER.
      DEFINE INPUT PARAMETER lpParameters AS CHARACTER.
      DEFINE INPUT PARAMETER lpDirectory  AS CHARACTER.
      DEFINE INPUT PARAMETER nShowCmd   AS LONG.
    END PROCEDURE. /* WinExec */
    
    PROCEDURE InternetOpenA EXTERNAL "wininet.dll":
      DEFINE INPUT PARAMETER lpszAgent       AS CHARACTER.
      DEFINE INPUT PARAMETER dwAccessType    AS LONG.
      DEFINE INPUT PARAMETER lpszProxyName   AS CHARACTER.
      DEFINE INPUT PARAMETER lpszProxyBypass AS CHARACTER.
      DEFINE INPUT PARAMETER dwFlags         AS LONG.
      DEFINE RETURN PARAMETER result AS LONG.
    END PROCEDURE.
    
    PROCEDURE InternetConnectA EXTERNAL "wininet.dll":
      DEFINE INPUT  PARAMETER hInternet        AS LONG.
      DEFINE INPUT  PARAMETER lpszServerName   AS CHARACTER.
      DEFINE INPUT  PARAMETER nServerPort      AS LONG.
      DEFINE INPUT  PARAMETER lpszUsername     AS CHARACTER.
      DEFINE INPUT  PARAMETER lpszPassword     AS CHARACTER.
      DEFINE INPUT  PARAMETER dwService        AS LONG.
      DEFINE INPUT  PARAMETER dwFlags          AS LONG.
      DEFINE INPUT  PARAMETER dwContext        AS LONG.
      DEFINE RETURN PARAMETER result           AS LONG.
    END PROCEDURE.
    
    PROCEDURE HttpOpenRequestA EXTERNAL "wininet.dll":
      DEFINE INPUT  PARAMETER hConnect AS LONG.
      DEFINE INPUT  PARAMETER lpszVerb          AS CHARACTER.
      DEFINE INPUT  PARAMETER lpszObjectName    AS CHARACTER.
      DEFINE INPUT  PARAMETER lpszVersion       AS CHARACTER.
      DEFINE INPUT  PARAMETER lpszReferer       AS CHARACTER.
      DEFINE INPUT  PARAMETER lplpszAcceptTypes AS LONG.
      DEFINE INPUT  PARAMETER dwFlags           AS LONG.
      DEFINE INPUT  PARAMETER dwContext         AS LONG.
      DEFINE RETURN PARAMETER result            AS LONG.
    END PROCEDURE.
    
    PROCEDURE HttpSendRequestA EXTERNAL "wininet.dll":
      DEFINE INPUT  PARAMETER hRequest         AS LONG.
      DEFINE INPUT  PARAMETER lpszHeaders      AS CHARACTER.
      DEFINE INPUT  PARAMETER dwHeadersLength  AS LONG.
      DEFINE INPUT  PARAMETER lpOptional       AS CHARACTER.
      DEFINE INPUT  PARAMETER dwOptionalLength AS LONG.
      DEFINE RETURN PARAMETER result           AS SHORT.
    END PROCEDURE.
    
    /*PROCEDURE InternetOpenUrlA EXTERNAL "wininet.dll":
      DEFINE INPUT  PARAMETER hInternetSession AS LONG.
      DEFINE INPUT  PARAMETER lpszUrl          AS CHARACTER.
      DEFINE INPUT  PARAMETER lpszHeaders      AS CHARACTER.
      DEFINE INPUT  PARAMETER dwHeadersLength  AS LONG.
      DEFINE INPUT  PARAMETER dwFlags          AS LONG.
      DEFINE INPUT  PARAMETER dwContext        AS LONG.
      DEFINE RETURN PARAMETER result           AS LONG.
    END PROCEDURE. */
    
    
    PROCEDURE InternetSetOptionA EXTERNAL "wininet.dll":
      DEFINE INPUT  PARAMETER hInternet        AS LONG.
      DEFINE INPUT  PARAMETER dwOption         AS LONG.
      DEFINE INPUT  PARAMETER lpBuffer      AS CHAR.
      DEFINE INPUT  PARAMETER dwBufferLength   AS LONG.
    END PROCEDURE.
    
    PROCEDURE InternetCloseHandle EXTERNAL "wininet.dll":
      DEFINE INPUT  PARAMETER hInet           AS LONG.
      DEFINE RETURN PARAMETER result          AS SHORT.
    END PROCEDURE.
    
    PROCEDURE InternetReadFile EXTERNAL "wininet.dll":
      DEFINE INPUT  PARAMETER hFile                 AS LONG.
      DEFINE OUTPUT PARAMETER lpBuffer              AS MEMPTR.
      DEFINE INPUT  PARAMETER dwNumberOfBytesToRead AS LONG.
      DEFINE OUTPUT PARAMETER lNumberOfBytesRead    AS LONG.
      DEFINE RETURN PARAMETER result                AS SHORT.
    END PROCEDURE.
    
    PROCEDURE CopyURLToFile:
        DEFINE INPUT  PARAMETER cServer   AS CHARACTER  NO-UNDO.
        DEFINE INPUT  PARAMETER iPort     AS INTEGER    NO-UNDO.
        DEFINE INPUT  PARAMETER cPage     AS CHARACTER  NO-UNDO.
        DEFINE INPUT  PARAMETER cForm     AS LONGCHAR   NO-UNDO.
        DEFINE INPUT  PARAMETER cFileName AS CHARACTER  NO-UNDO.
      
        DEFINE VARIABLE cFormType         AS CHARACTER  NO-UNDO.
        DEFINE VARIABLE mForm             AS MEMPTR     NO-UNDO.
    
        DEFINE VARIABLE hInternetSession  AS INTEGER    NO-UNDO.
        DEFINE VARIABLE hUrl              AS INTEGER    NO-UNDO.
        DEFINE VARIABLE hData             AS INTEGER    NO-UNDO.
        DEFINE VARIABLE lOK               AS INTEGER    NO-UNDO.
        DEFINE VARIABLE NumberOfBytesRead AS INTEGER    NO-UNDO.
        DEFINE VARIABLE mBuffer           AS MEMPTR     NO-UNDO.
        DEFINE VARIABLE mBuffer1          AS MEMPTR     NO-UNDO.
        DEFINE VARIABLE fileIsOpen        AS LOGICAL    NO-UNDO.
      
        DEFINE VARIABLE iTimeout          AS CHAR INIT '10000'  NO-UNDO.
    
        If LENGTH(cServer) = 0 OR iPort = 0 Or LENGTH(cFileName) = 0 THEN
            RETURN "NOK".
                  
      
    
        /* open an Internet session, and retrieve its handle */
        RUN InternetOpenA ("", 0, "", "", 0,OUTPUT hInternetSession).
      
        If hInternetSession = 0 Then
            RETURN "NOK".
              
        RUN InternetConnectA(hInternetSession, cServer, iPort, " "," ", 3, 0, 0, OUTPUT hUrl).
      
        If hUrl = 0 THEN DO:
            RUN InternetCloseHandle(hInternetSession, OUTPUT lOK).
            RETURN "NOK".
        END.
      
         RUN InternetSetOptionA(hInternetSession, 6, iTimeout, 4096).
      
        RUN HttpOpenRequestA(hUrl, "POST", cPage,"","",0,4194304,0, OUTPUT hData).
    
        IF hData = 0 THEN DO:
            RUN InternetCloseHandle(hInternetSession, OUTPUT lOK).
            RUN InternetCloseHandle(hUrl, OUTPUT lOK).
            RETURN "NOK".
        END.
      
        cFormType = "Content-Type: application/x-www-form-urlencoded".
      
        RUN HttpSendRequestA( hData, cFormType, LENGTH(cFormType), cForm, LENGTH(cForm), OUTPUT lok).
    
        OUTPUT TO VALUE(cFileName) BINARY NO-MAP NO-CONVERT.
    
        SET-SIZE(mBuffer) = 4096.
    
        REPEAT:
            /* read a chunk of the file - returns True if no error */
            RUN InternetReadFile(hData,OUTPUT mBuffer, 4096, OUTPUT NumberOfBytesRead,OUTPUT lOK).
          
            /* exit if error or no more data */
            If NumberOfBytesRead = 0 Or lOK = 0 THEN
                LEAVE.
            SET-SIZE(mBuffer1) = NumberOfBytesRead.
    
            PUT-BYTES (mBuffer1, 1) = GET-BYTES(mBuffer,1,NumberOfBytesRead).
    
            /* save the data to the local file */
            EXPORT mBuffer1.
            SET-SIZE(mBuffer1) = 0.
        END.
    
        OUTPUT CLOSE.
    
        RUN InternetCloseHandle(hData, OUTPUT lOK).
        RUN InternetCloseHandle(hUrl, OUTPUT lOK).
        RUN InternetCloseHandle(hInternetSession, OUTPUT lOK).
      
    END PROCEDURE.
  2. tcoutinho

    tcoutinho Moderador Moderador Equipe de Suporte

    Bom dia Cintia,
    Você está rodando isso local ?
    Possui algum proxy, firewall ou antivirus?
    cintiasottelli curtiu isso.
  3. cintiasottelli

    cintiasottelli Membro Participativo

    Bom dia!
    Estou rodando no servidor... O que mais me deixa intrigada é que se eu rodo a url direto no navegador, independente do tempo ele gera o arquivo.

    Pensei ser algo de timeout e tentamos chamar essa InternetSetOptionA mas da mesma forma interrompe a conexão.

    Você ja passou por algo do gênero?
  4. joelscampos

    joelscampos Membro Participativo

    Se você ainda não conseguiu resolver, segue uma sugestão.


    Com o código abaixo você consegue se conectar com um webservice.

    Acho que a única coisa que precisaria mudar seria o retorno, de longchar para memptr, e trocar a procedure "BuscaBeneficiarioPorCarteira" por outra com o nome da operação disponível no webservice
    Para gerar a procedure "BuscaBeneficiarioPorCarteira" utiliza-se o (c:\dlc102b\bin\proenv.bat), e executa nele o comando:

    bprowsdldoc http://servidor.com.br/BeneficiarioWs.asmx?wsdl




    Código:
    
    RUN pr-comunica-com-ws.
    
    PROCEDURE pr-comunica-com-ws:
    
        DEF VAR hWebService                         AS HANDLE   NO-UNDO.
        DEF VAR hBeneficiarioWSSoap                 AS HANDLE   NO-UNDO.
        DEF VAR BuscaBeneficiarioPorCarteiraResult  AS LONGCHAR NO-UNDO.
    
        ETIME(YES).
       
        CREATE SERVER hWebService.
       
        /* abre conexao */
        hWebService:CONNECT("-WSDL 'http://servidor.com.br/BeneficiarioWs.asmx?wsdl'").
       
        IF NOT hWebService:CONNECTED()
        THEN DO:
            MESSAGE
                "Could not connect to WebService server"
                VIEW-AS ALERT-BOX INFO BUTTONS OK.
            RETURN.
        END.
       
    
    
        /* instancia o portType */
        RUN BeneficiarioWSSoap SET hBeneficiarioWSSoap ON hWebService.
    
        IF NOT VALID-HANDLE(hBeneficiarioWSSoap)
        THEN DO:
            MESSAGE
                "Could not establish portType"
                VIEW-AS ALERT-BOX INFO BUTTONS OK.
            RETURN.
        END.
    
        /* invoca a operacao */
        RUN BuscaBeneficiarioPorCarteira IN hBeneficiarioWSSoap (INPUT "970",                                   /* strCdUnimed       */
                                                                 INPUT "1234567890123",                         /* strCdBeneficiario */
                                                                 INPUT "xx",                                    /* strAplicacao      */
                                                                 INPUT "xxx",                                   /* strSenha          */
                                                                 INPUT "xxx",                                   /* strGUID           */
                                                                 OUTPUT BuscaBeneficiarioPorCarteiraResult).    /* retorno */
       
       
        MESSAGE
            "Tempo: " ETIME "milliseconds"  SKIP
            "---------------------------"   SKIP
            STRING(SUBSTR(BuscaBeneficiarioPorCarteiraResult,1,1000))
            VIEW-AS ALERT-BOX.
    
        /* imprime a resposta */
        OUTPUT TO "c:\spool\response.xml" .
        EXPORT BuscaBeneficiarioPorCarteiraResult.
        OUTPUT CLOSE.
           
       
    
        FINALLY:
           
            /* fecha conexao */
            IF hWebService:CONNECTED()
            THEN
                hWebService:DISCONNECT().
    
            /* limpa memoria */
            IF VALID-HANDLE(hWebService)
            THEN
                DELETE WIDGET hWebService.
    
            /* fecha arquivo de teste */
            OUTPUT CLOSE.
        END FINALLY.
    END PROCEDURE. /*pr-comunica-com-ws*/
    
    
    
    PROCEDURE BuscaBeneficiarioPorCarteira:
      DEFINE INPUT PARAMETER strCdUnimed AS CHARACTER NO-UNDO.
      DEFINE INPUT PARAMETER strCdBeneficiario AS CHARACTER NO-UNDO.
      DEFINE INPUT PARAMETER strAplicacao AS CHARACTER NO-UNDO.
      DEFINE INPUT PARAMETER strSenha AS CHARACTER NO-UNDO.
      DEFINE INPUT PARAMETER strGUID AS CHARACTER NO-UNDO.
      DEFINE OUTPUT PARAMETER BuscaBeneficiarioPorCarteiraResult AS LONGCHAR NO-UNDO.
    END PROCEDURE.
    
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página