Question

Je suis très nouveau dans le domaine des services Web, alors veuillez être gentil.

J'ai écrit une classe POJO simple et je l'ai déployée sur un serveur 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;
    }

}

J'appelle le service à partir d'un client c #:

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

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

pr = db.getProject();

Lorsque je débogue la réponse, la valeur est null. En java, lorsque j'appelle getProject, l'objet de projet est null.

Qu'est-ce qui se passe? Comment préserver l'état du projet entre les appels de service?

Était-ce utile?

La solution

Pour la plupart des boîtes à outils, les services Web sont sans état par défaut. Je pense que l’axe n’est pas différent.

Si vous souhaitez conserver l'état entre les appels, vous devez activer les sessions. Vous trouverez un exemple sur la gestion des sessions dans l’axe à l’adresse suivante:

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

Du côté .NET, vous devrez affecter un CookieContainer à votre demande pour stocker l'identifiant de session. Pour plus d'informations, voir COMMENT UTILISER: CookieContainer pour conserver un état dans les services Web .

Je pense que votre code ressemblerait à quelque chose comme ceci:

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();


Je pense que cela devrait vous permettre de faire ce que vous voulez - mais je ne le recommanderais pas .

La conception des interfaces de service est un peu différente de la conception d’interfaces orientées objet. Les interfaces de service évitent généralement l'utilisation de l'état et obligent le consommateur à fournir toutes les informations pertinentes dans la demande.

De Architecture orientée services :

  

Les services doivent être indépendants,   demandes autonomes, qui ne sont pas   demander des informations ou un état d'un   demande à un autre lors de la mise en œuvre.

Je recommanderais certainement de lire cet article et peut-être de revoir votre conception.

Autres conseils

Je ne suis pas sûr de savoir pourquoi @shivaspk a laissé un commentaire au lieu d'écrire une réponse, c'est tout à fait correct: les appels de service Web (pas uniquement les appels d'axe) sont censés être sans état. Ainsi, l'objet de projet est créé par

db.login();

quand vous appelez

db.getProject();

Il est appelé sur une autre instance de votre classe de base de données créée par Axis pour répondre au deuxième appel.

Il n’ya pas vraiment de bonne réponse à votre question, si ce n’est à vous de repenser ce que vous essayez de faire. Si vous avez besoin d’une sorte d’authentification (via login), cette authentification doit faire partie de chaque appel de service Web.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top