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

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

  •  07-07-2019
  •  | 
  •  

Вопрос

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

Я написал простой класс 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 , объект project имеет значение null.

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

Это было полезно?

Решение

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

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

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


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

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

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

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

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

Другие советы

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

db.login();

когда вы звоните

db.getProject();

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top