PDA

Ver la Versión Completa : webservice con Sesion


comba
01-03-2011, 20:04:40
Hola estoy utilizando delphi2007 y tengo que consumir 2 webservices.
Hasta hay no hay problema.

El 1º no hay problema ya que conecta perfectamente. Paso unos parametros y este me devuelve otros.

El 2º es donde viene el problema ya que para utilizarlo tengo que utilizar una variable del 1º que es la sesion.
Pero cuando voy a consumir el 2º webservices no tengo una variable session me dicen que tengo que utilizar esta clase

ROClientIDHeader = class(TSOAPHeader)
private
FID: WideString;
FID_Specified: boolean;
procedure SetID(Index: Integer; const AWideString: WideString);
function ID_Specified(Index: Integer): boolean;
published
property ID: WideString Index (IS_OPTN) read FID write SetID stored ID_Specified;
end;

También me dicen que construya el webservice y que pase la sesion a la propiedad id.

La verdad es que hay es donde me pierdo.
Alguien me pueda orientar un poquito.

Muchas gracias.:)

Ñuño Martínez
02-03-2011, 12:14:20
El tema de las sesiones es complicado. ¿Están los dos servicios en el mismo dominio? Porque normalmente las sesiones se asocian a un único dominio para evitar suplantaciones.

comba
02-03-2011, 16:18:26
Efectivamente los 2 estan en el mismo dominio.

Ñuño Martínez
03-03-2011, 10:02:37
Disculpa si peco de condescendiente pero, sabes lo que es una "sesión", ¿verdad? Lo digo porque acabo de releer tu primer mensaje y la sentencia "que construya el webservice y que pase la sesión a la propiedad id" no tiene mucha sentido para mi.

En web se trabaja por peticiones, es decir, un cliente hace una petición y el servidor responde a dicha petición. En principio el servidor maneja cada petición de forma independiente; los datos generados en una petición no están disponibles en la siguiente. En ocasiones es conveniente que algunos datos "permanezcan" entre petición y petición, y ahí entran las sesiones.

Si la sesión es gestionada por el servidor, primero el cliente pide al servidor un identificador de sesión, entonces el servidor crea una "sesión persistente", la identifica y devuelve el identificador. A partir de ese momento el cliente incluye ese identificador en las peticiones de forma que el servidor "sepa" que puede/debe utilizar los datos de dicha sesión.

Hay sesiones que son gestionadas por el cliente, en cuyo caso los datos se almacenan en el lado cliente, por ejemplo usando huellas (cookies). Ahora el cliente debe incluir toda la información almacenada en la sesión en cada petición.

Normalmente las sesiones no sólo llevan asociadas un identificador sino también la dirección IP del cliente y una caducidad. De esta forma han de coincidir ambos valores (identificador e IP) para poder acceder a la misma. Y también, si durante un tiempo no se hace ninguna petición la sesión se destruye.

Nunca he usado SOAP, pero por lo poco que sé lleva implícito la gestión de sesiones. Supongo que a lo que se refiere con la frase que he citado al principio es que obtengas el identificador de la sesión SOAP del primer servicio y se la pases al segundo servicio, pero no tengo nada claro que esto sirva de algo puesto que cada servicio usará su propio espacio de trabajo. Lo más probable es que debas crear tu propio sistema de sesiones (con la información que te he dado no debería costarte mucho imaginar cómo hacerlo).

Quim Herrera
11-12-2020, 10:13:29
Tengo el mismo problema al consumir un webservice de una empresa de transportes. Llamas al primer webservice para identificarte y te devuelve un id que debes mandar al segundo website dentro del <header> junto con los datos para dar de alta el envio.
He importado los wsdl con delphi tokyo y la cabecera está allí:
ROClientIDHeader = class;
.....

// ************************************************************************ //
// XML : ROClientIDHeader, global, <element>
// Namespace : http://tempuri.org/
// Info : Header
// ************************************************************************ //
ROClientIDHeader = class(TSOAPHeader)
private
FID: string;
FID_Specified: boolean;
procedure SetID(Index: Integer; const Astring: string);
function ID_Specified(Index: Integer): boolean;
published
property ID: string Index (IS_OPTN) read FID write SetID stored ID_Specified;
end;
.....


procedure ROClientIDHeader.SetID(Index: Integer; const Astring: string);
begin
FID := Astring;
FID_Specified := True;
end;

function ROClientIDHeader.ID_Specified(Index: Integer): boolean;
begin
Result := FID_Specified;
end;

...
InvRegistry.RegisterHeaderClass(TypeInfo(WebServService), ROClientIDHeader, 'ROClientID', 'http://tempuri.org/');


Pero no sé como incluirla en el xml al hacer el envio.

Se está enviando:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<WebServService___GrabaEnvio19 xmlns="http://tempuri.org/">
<strCodAgeCargo>099999</strCodAgeCargo>
<strCodAgeOri>099999</strCodAgeOri>
...
<strCodPuntoConveniencia/>
</WebServService___GrabaEnvio19>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

y deberia enviarlo con la cabecera:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Header>
<ROClientIDHeader xmlns="http://tempuri.org/">
<ID>{--idSesion--}</ID>
</ROClientIDHeader>
</soap:Header>
<SOAP-ENV:Body>
<WebServService___GrabaEnvio19 xmlns="http://tempuri.org/">
<strCodAgeCargo>099999</strCodAgeCargo>
<strCodAgeOri>099999</strCodAgeOri>
...
<strCodPuntoConveniencia/>
</WebServService___GrabaEnvio19>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

¿ Alguien puede ayudarme a incluir la cabecera en el XML ?

Muchas gracias

Casimiro Notevi
11-12-2020, 11:09:56
Deberías crear un hilo nuevo, y pon un título descriptivo.
Aquí sólo van a ver tu pregunta quienes han participado en este hilo.

Quim Herrera
11-12-2020, 12:04:18
Hola Casimiro,
Ya he creado el nuevo.
Gracias