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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top