Bonjour,

En tentant d'envoyer un gros fichier xml (environ 1 mo) via UTL_HTTP.getresponse(laRequete)
J'obtiens l'erreur suivante :

"Erreur dans Envoyer_KML
ORA-29273: échec de demande HTTP
ORA-06512: à "SYS.UTL_HTTP", ligne 1231
ORA-12547: TNS : contact perdu"

La premiere chose que je ne comprends pas c'est comment lire l'erreur.
Je pensais que
ORA-29273: échec de demande HTTP est due à
ORA-06512: à "SYS.UTL_HTTP", ligne 1231 est due à
ORA-12547: TNS : contact perdu"

en clair je crois que c'est l'erreur contact perdu qui entraine les autres.
C'est bien ça?

J'ai pensé à des pbm de pare feu mais sur le serveur de base de données j'arrive à afficher la page du serveur distant. mais il a fallu changer la conf du proxy sous IE. je ne sais pas s'il faut rebooter quelque chose?
J'arrive à faire un TNSPING sur le serveur. le TNSNAME.ORA est bon.
Je n'ai pas de variable ORACLE_HOME ni de variable ORACLE SID
Je suis sous windows 2003 Server enterprise edition. oracle 10Gr2.

Deuxieme question : avez vous des idées pour corriger le souci?




Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
 
-- 
-- Envoi d'un KML dans l'extranet via POST
-- 
PROCEDURE Envoyer_KML
	( pNomFic		 VARCHAR2
    )
IS
  vContenu       	VARCHAR2(4000); --contiendra le debut du contenu le content de la requete HTTP
  vPostText     	CLOB;
  vRequest      	UTL_HTTP.REQ;
  vResponse     	UTL_HTTP.RESP;
  vResponseText 	VARCHAR2(4000);
  vErrorText    	VARCHAR2(2000);
  vReponseWsOk      VARCHAR2(7) 	:='{"Id":%';
 
  vContentLenght   integer:=0;     --contiendra la taille de la requete HTTP
 
  vLeBfile			BFILE;
  vLen 				NUMBER := dbms_lob.lobmaxsize;
  vNum 				NUMBER ;
  vSrc_off 			PLS_INTEGER := 1 ;
  vDst_off 			PLS_INTEGER := 1 ;
  vLangctx 			NUMBER := dbms_lob.default_lang_ctx ;
  vWarn 			NUMBER;
 
  nStart 			NUMBER := 1;
  nEnd 				NUMBER := 32001;
  nClobLength 		NUMBER;
  vChunkData 		VARCHAR2(32000);
  nLength 			NUMBER := 32000;
 
  vFrontiere 		VARCHAR2(60) := 'UGm9bi3xfU1DeaauuXkZ22BYwyISyuvOvo';
 
  vTimeStamp		VARCHAR2(20)	:='';
  vSignature		VARCHAR2(40)	:='';
 
BEGIN
 
	vTimeStamp	:=TO_CHAR(CURRENT_TIMESTAMP, FORMAT_TIMESTAMP_HACHAGE);
	vSignature	:=lower(RAWTOHEX(champCrypte(CLE_SECRETE,vTimeStamp)));
 
	--*****************************************
	--lecture du fichier dans un clob
	--*****************************************
 
	--creation du fichier temporaire
	dbms_lob.createtemporary( vPostText, TRUE ) ;
 
	--initialisation du clob au debut de la requete
	vContenu :=             '--' || vFrontiere || CHR(13) || CHR(10) || 'content-disposition: form-data; name="directoryId"' || CHR(13) || CHR(10);
	vContenu := vContenu || 'Content-Type: text/plain; charset=UTF-8' || CHR(13) || CHR(10);
	vContenu := vContenu || 'Content-Transfer-Encoding: 8bit'  || CHR(13) || CHR(10)  || CHR(13) || CHR(10);
	vContenu := vContenu || '2' || CHR(13) || CHR(10);
	vContenu := vContenu || '--' || vFrontiere || CHR(13) || CHR(10) || 'content-disposition: form-data; name="8"; filename="' || pNomFic || '"' || CHR(13) || CHR(10) ;
	vContenu := vContenu || 'Content-Type: application/octet-stream' || CHR(13) || CHR(10) ;
	vContenu := vContenu || 'Content-Transfer-Encoding: binary';
	vContenu := vContenu || CHR(13) || CHR(10) || CHR(13) || CHR(10); --le deuxieme retour chariot et line feed est important : fo pas le retirer.
	dbms_lob.write(vPostText, LENGTH(vContenu), 1, vContenu);
 
  Tracage('Envoyer_KML','init CLOB effectue');
 
	--ouverture du fichier
	vLeBfile := BFILENAME('KML_FILES', pNomFic );
 	dbms_lob.fileopen(vLeBfile, dbms_lob.file_readonly);
 
  Tracage('Envoyer_KML','ouverture du fichier effectue');
 
	--reglage du debut de la destination à la fin du CLOB
	vDst_off := LENGTH(vContenu)+1;
 
	DBMS_LOB.LOADCLOBFROMFILE (
		vPostText,              -- CLOB de destination
        vLeBfile,               -- Pointeur fichier en entrée
        vLen,                	-- Nombre d'octets à lire
        vDst_off,               -- Position destination de départ
        vSrc_off,            	-- Position source de départ
        dbms_lob.default_csid,  -- CSID
        vLangctx,            	-- Contexte langue
        vWarn);              	-- Message d'avertissement
	dbms_lob.fileclose(vLeBfile);
 
	--écriture de la derniere frontiere (fin du fichier) fo pas retirer le premier retour chariot / line feed
	dbms_lob.writeappend(vPostText, length(vFrontiere)+8,CHR(13) || CHR(10) || '--' || vFrontiere || '--' || CHR(13) || CHR(10));
 
    Tracage('Envoyer_KML','LOADCLOBFROMFILE effectue');
 
	--*****************************************
	--envoi du fichier 
	--*****************************************
 
	--création de l'objet requête
	vRequest := UTL_HTTP.BEGIN_REQUEST
        ( url 			=> ADRESSE_WS_KML  
        , METHOD 		=> 'POST'
        , http_version	=> 'HTTP/1.1'
        );
 
	--réglage de la requete au format UTF-8
	UTL_HTTP.SET_BODY_CHARSET
		(r 			=> vRequest
	    ,charset 	=> CHARSET_EMISSION);
 
	--le header timestamp
	UTL_HTTP.SET_HEADER
      ( r     => vRequest
      , NAME  => 'Lutece Request Timestamp'
      , VALUE => vTimeStamp
      );
 
	--le header signature
    UTL_HTTP.SET_HEADER
      ( r     => vRequest
      , NAME  => 'Lutece Request Signature'
      , VALUE => vSignature
      );
 
	--le header Content-Type
	UTL_HTTP.SET_HEADER
		( r     => vRequest
		, NAME  => 'Content-Type'
		, VALUE => 'multipart/form-data; boundary=' || vFrontiere
		);
 
	--le header Content-Length
    UTL_HTTP.SET_HEADER
		( r     => vRequest
	 	, NAME  => 'Content-Length'
	    , VALUE => (dbms_lob.getLength(vPostText)+2)
		);
 
	nClobLength := dbms_lob.getLength(vPostText);
 
    Tracage('Envoyer_KML','preparation envoi  effectue');
 
	--
	--ecrire le corps de la requete en faisant une boucle 
	--
	--UTL_HTTP.WRITE_TEXT (vRequest, vContenu);
	LOOP
		if nEnd > nClobLength then
		  nEnd := nClobLength;
		  nLength := nEnd - nStart+1;
		end if;
		--DBMS_OUTPUT.PUT_LINE ('nEnd:' || nEnd || ' nClobLength:' || nClobLength || ' nLength:' || nLength);
		vChunkData := null;
		vChunkData := DBMS_LOB.SUBSTR(vPostText, nLength, nStart);
		UTL_HTTP.WRITE_TEXT ( vRequest, vChunkData );
		--DBMS_OUTPUT.PUT_LINE ( vChunkData || 'coucouFGcoucou' );
		if nEnd = nClobLength then
		  exit;
		end if;
		nStart := nEnd;
		nEnd := nStart + 32000;
	END LOOP;
 
    Tracage('Envoyer_KML','boucle write text effectue');
 
	--réglage du timeout de la requete à 512
	utl_http.set_transfer_timeout(vRequest,512);
	--envoi de la requete et récupération de la réponse
    Tracage('Envoyer_KML','avant getResponse');
	vResponse := UTL_HTTP.GET_RESPONSE(vRequest);
    Tracage('Envoyer_KML','apres getResponse');
	--*************************************************************
	--analyse de la réponse
	--*************************************************************
	IF vResponse.status_code = STATUS_OK THEN
		--reponse = OK 
		UTL_HTTP.SET_BODY_CHARSET
			(r 			=> vResponse
			,charset 	=> CHARSET_RECEPTION);
		--lire la réponse
		UTL_HTTP.READ_TEXT(vResponse, vResponseText);
		--si reponse NOK mettre son contenu dans la variable d'erreur
		IF vResponseText NOT LIKE vReponseWsOk THEN
			vErrorText := vResponseText;
		END IF;
    ELSE --reponse = NOK
		--mettre le code et la raison dans la variable d'erreur
		vErrorText := 'status:'||vResponse.status_code||' reason:'||vResponse.reason_phrase;
    END IF;
    --fermer la réponse libérer les CLOB
    UTL_HTTP.END_RESPONSE(vResponse);
    dbms_lob.freetemporary(vPostText);
 
    --si la variable d'erreur n'est pas vide : journaliser et envoyer un mail
    IF vErrorText IS NOT NULL THEN
		--je ne lève pas une ereur pour ne pas bloquer tout, j'envoie juste un mail
		LOG_ET_ENVOI_MAIL_ERREUR(-1, '', 'Erreur dans la procédure de création du fichier KML : '||' '||vErrorText, 'PKG_EXTRANET_DES_CONSIGNATIONS-Envoyer_KML');
    END IF;
 
	EXCEPTION
		WHEN OTHERS THEN
		LOG_ET_ENVOI_MAIL_ERREUR(SQLCODE, SQLERRM, 'Erreur dans Envoyer_KML','PKG_EXTRANET_DES_CONSIGNATIONS.Envoyer_KML');
 
END Envoyer_KML;
TRACES :
Succès de l'élément pkg_extranet_des_consignations.envoyer_kml 'BR+CONSIGNATION.KML').
[Envoyer_KML] init CLOB effectue
[Envoyer_KML] ouverture du fichier effectue
[Envoyer_KML] LOADCLOBFROMFILE effectue
[Envoyer_KML] preparation envoi effectue
[Envoyer_KML] boucle write text effectue
[Envoyer_KML] avant getResponse

Je ne pense pas que le souci soit dans le code : je crois que c'est un paramètre réseau ou de base de données.
Avez vous des suggestions?
D'avance Merci, Franck