client c # che chiama il servizio web java axis2, oggetto & # 8220; ripristina & # 8221;

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

  •  07-07-2019
  •  | 
  •  

Domanda

Sono molto nuovo con i servizi web, quindi per favore sii gentile.

Ho scritto una semplice classe POJO e l'ho distribuita su un server 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;
    }

}

Chiamo il servizio da un client c #:

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

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

pr = db.getProject();

Quando eseguo il debug la risposta è nulla. Alla fine di Java, quando chiamo getProject, l'oggetto del progetto è null.

Cosa sta succedendo? Come posso preservare lo stato del progetto tra le chiamate di servizio?

È stato utile?

Soluzione

Per la maggior parte dei toolkit, i servizi Web sono senza stato per impostazione predefinita. Penso che l'asse non sia diverso.

Se si desidera mantenere lo stato tra le chiamate, sarà necessario abilitare le sessioni. Un esempio su come mantenere le sessioni in asse è disponibile all'indirizzo:

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

Sul lato .NET dovrai assegnare un CookieContainer alla tua richiesta per memorizzare l'identificatore di sessione. Vedere COME: usare CookieContainer per mantenere uno stato nei servizi Web per ulteriori informazioni.

Penso che il tuo codice sarebbe simile a questo:

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


Penso che dovrebbe permetterti di fare quello che vuoi - ma non lo consiglierei .

La progettazione di interfacce di servizio è leggermente diversa dalla progettazione di interfacce orientate agli oggetti. Le interfacce di servizio in genere evitano l'uso dello stato e richiedono invece al consumatore di fornire tutte le informazioni pertinenti nella richiesta.

Da Architettura orientata ai servizi :

  

I servizi dovrebbero essere indipendenti,   richieste autonome, che non lo fanno   richiedere informazioni o stato da uno   richiesta a un altro quando implementato.

Consiglio vivamente di leggere quell'articolo e magari di rivisitare il tuo design.

Altri suggerimenti

Non sono sicuro del motivo per cui @shivaspk ha lasciato un commento invece di scrivere una risposta, è del tutto corretto: le chiamate ai servizi Web (non solo le chiamate agli assi) sono pensate per essere senza stato, quindi sebbene l'oggetto del progetto venga creato da

db.login();

quando chiami

db.getProject();

Viene chiamato in un'altra istanza della classe del database creata da Axis per servire la seconda chiamata.

Non c'è davvero una buona risposta alla tua domanda, tranne che per ripensare a ciò che stai cercando di fare. Se hai bisogno di un tipo di autenticazione (tramite login), tale autenticazione deve far parte di ogni chiamata al servizio web.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top