c # клиент, вызывающий веб-сервис java axis2, объект "сбрасывается" - PullRequest
0 голосов
/ 15 сентября 2009

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

Я написал простой класс 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;
    }

}

Я звоню в сервис от клиента c #:

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

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

pr = db.getProject();

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

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

Ответы [ 2 ]

0 голосов
/ 15 сентября 2009

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

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

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


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

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

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

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

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

0 голосов
/ 15 сентября 2009

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

db.login();

при звонке

db.getProject();

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

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

...