c # cliente que llama al servicio web java axis2, objeto & # 8220; restablece & # 8221;

StackOverflow https://stackoverflow.com/questions/1426919

  •  07-07-2019
  •  | 
  •  

Pregunta

Soy muy nuevo en el servicio web, así que por favor sea amable.

Escribí una clase POJO simple y la implementé en un servidor axis2:

public class Database {

    private Project project;

    public void login(){
        project = new Project();
        project.setDescription("Hello there");
        project.setName("To me");
    }

    public Project getProject(){
        return project;
    }

}

Llamo al servicio desde un cliente de C #:

localhost.Database db = new WindowsFormsApplication1.localhost.Database();
db.login();

localhost.getProjectResponse pr = new WindowsFormsApplication1.localhost.getProjectResponse();

pr = db.getProject();

Cuando depuro la respuesta es nula. Al final de Java, cuando llamo a getProject, el objeto del proyecto es nulo.

¿Qué está pasando? ¿Cómo conservo el estado del proyecto entre llamadas de servicio?

¿Fue útil?

Solución

Para la mayoría de los kits de herramientas, los servicios web no tienen estado de forma predeterminada. Creo que el eje no es diferente.

Si desea mantener el estado entre llamadas, deberá habilitar las sesiones. Puede encontrar un ejemplo sobre cómo mantener las sesiones en el eje en:

http://kickjava.com/src/test/session/TestSimpleSession .java.htm

En el lado .NET, deberá asignar un CookieContainer a su solicitud para almacenar el identificador de sesión. Consulte CÓMO: Usar CookieContainer para mantener un estado en los servicios web para obtener más información.

Creo que su código se vería así:

localhost.Database db = new WindowsFormsApplication1.localhost.Database();
// Assign the CookieContainer to the proxy class.  
db.CookieContainer = new System.Net.CookieContainer();

db.login();

localhost.getProjectResponse pr = new WindowsFormsApplication1.localhost.getProjectResponse();
pr.CookieContainer = db.CookieContainer;

pr = db.getProject();


Creo que debería permitirte hacer lo que quieras, pero no lo recomendaría .

Diseñar interfaces de servicio es un poco diferente a diseñar interfaces orientadas a objetos. Las interfaces de servicio generalmente evitan el uso del estado y, en cambio, requieren que el consumidor proporcione toda la información relevante en la solicitud.

De Arquitectura orientada a servicios :

  

Los servicios deben ser independientes,   solicitudes independientes, que no   requerir información o estado de uno   solicitar a otro cuando se implemente.

Definitivamente recomendaría leer ese artículo y quizás volver a visitar su diseño.

Otros consejos

No estoy seguro de por qué @shivaspk dejó un comentario en lugar de escribir una respuesta, es bastante correcto: las llamadas al servicio web (no solo las llamadas al eje) están destinadas a no tener estado, por lo que aunque el objeto del proyecto se crea por

db.login();

cuando llamas

db.getProject();

Se está llamando en una instancia diferente de su clase de base de datos creada por Axis para atender la segunda llamada.

No hay una respuesta realmente buena a su pregunta, excepto que debe repensar lo que está tratando de hacer. Si necesita algún tipo de autenticación (mediante inicio de sesión), esa autenticación debe ser parte de cada llamada al servicio web.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top