С# клиент, вызывающий веб-службу java axis2, сброс объекта

Я очень новичок в веб-сервисах, поэтому, пожалуйста, будьте добры.

Я написал простой класс POJO и развернул его на сервере 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;
    }

}

Я вызываю службу из клиента С#:

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

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

pr = db.getProject();

Когда я отлаживаю, ответ равен нулю. В конце Java, когда я вызываю getProject, объект проекта имеет значение null.

Что происходит? Как сохранить состояние проекта между вызовами службы?


person Community    schedule 15.09.2009    source источник
comment
По умолчанию службы Axis не имеют состояния. Таким образом, вы не можете сохранить состояние черно-белых сервисных вызовов!   -  person shivaspk    schedule 15.09.2009


Ответы (2)


Для большинства наборов инструментов веб-службы по умолчанию не имеют состояния. Я думаю, что ось ничем не отличается.

Если вы хотите поддерживать состояние между вызовами, вам нужно будет включить сеансы. Пример того, как поддерживать сеансы в оси, можно найти по адресу:

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

На стороне .NET вам нужно будет назначить CookieContainer вашему запросу для хранения идентификатора сеанса. Дополнительную информацию см. в разделе КАК: использовать CookieContainer для сохранения состояния в веб-службах.

Я думаю, что ваш код будет выглядеть примерно так:

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


Я думаю, что это позволит вам делать то, что вы хотите -- но я бы не рекомендовал это.

Проектирование сервисных интерфейсов немного отличается от проектирования объектно-ориентированных интерфейсов. Сервисные интерфейсы обычно избегают использования состояния и вместо этого требуют, чтобы потребитель предоставил всю необходимую информацию в запросе.

Из Сервисно-ориентированная архитектура:

Сервисы должны быть независимыми, автономными запросами, которые не требуют информации или состояния от одного запроса к другому при реализации.

Я определенно рекомендую прочитать эту статью и, возможно, пересмотреть свой дизайн.

person Randy supports Monica    schedule 15.09.2009

Я не уверен, почему @shivaspk оставил комментарий вместо того, чтобы написать ответ, это совершенно правильно: вызовы веб-службы (не только вызовы оси) должны быть без состояния, поэтому, хотя объект проекта создается

db.login();

когда ты звонишь

db.getProject();

Он вызывается для другого экземпляра вашего класса базы данных, созданного Axis для обслуживания второго вызова.

На ваш вопрос нет действительно хорошего ответа, кроме как переосмыслить то, что вы пытаетесь сделать. Если вам нужна какая-то аутентификация (через вход в систему), то эта аутентификация должна быть частью каждого вызова веб-службы.

person Michael Sharek    schedule 15.09.2009