c # cliente java chamando serviço axis2 web, objeto “redefine”
-
07-07-2019 - |
Pergunta
Eu sou muito novo para o material de serviço da web por isso, ser gentil.
Eu escrevi uma classe POJO simples, e implantado em um servidor eixo2:
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;
}
}
eu chamar o serviço de um cliente c #:
localhost.Database db = new WindowsFormsApplication1.localhost.Database();
db.login();
localhost.getProjectResponse pr = new WindowsFormsApplication1.localhost.getProjectResponse();
pr = db.getProject();
Quando eu depurar a resposta é nulo. No final java, quando eu chamo getProject, o objeto de projeto é nulo.
O que está acontecendo? Como faço para preservar o estado do projeto entre as chamadas de serviço?
Solução
Para a maioria dos kits de ferramentas, serviços web são apátridas por padrão. Acho eixo não é diferente.
Se você quiser manter o estado entre chamadas então você vai precisar para permitir sessões. Um exemplo sobre como manter sessões no eixo pode ser encontrada em:
http://kickjava.com/src/test/session/TestSimpleSession .java.htm
No lado do .NET será necessário atribuir um CookieContainer ao seu pedido para armazenar o identificador de sessão. Consulte COMO:. Use CookieContainer para manter um estado em Web Services para mais informações
Eu acho que o código seria algo parecido com isto:
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();
Eu acho que deve deixá-lo fazer o que quiser - mas eu não recomendo .
Projetando interfaces de serviço é um pouco diferente do que o design de interfaces orientadas a objeto. interfaces de serviço normalmente evitam o uso de estado e, em vez obrigar o consumidor a fornecer todas as informações relevantes no pedido.
A partir Service-Oriented Architecture :
Os serviços devem ser independentes, solicitações de auto-contido, o que não fazer necessitam de informações ou de estado de um pedido para outro quando implementada.
Eu definitivamente recomendo a leitura desse artigo e talvez revisitar o seu design.
Outras dicas
Eu não sei por que @shivaspk deixou um comentário em vez de escrever uma resposta, é bastante correto: as chamadas de serviço web (e não apenas eixo chamadas) são destinadas a ser apátrida, por isso, embora o objeto de projeto é criado pelo
db.login();
quando você chamar
db.getProject();
Ele está sendo chamado em uma instância diferente de sua classe de banco de dados que foi criado por Axis ao serviço a segunda chamada.
Não há realmente boa resposta para sua pergunta, exceto para você repensar o que você está tentando fazer. Se você precisar de algum tipo de autenticação (via login), em seguida, que as necessidades de autenticação para ser parte de cada chamada de serviço web.