0

我对网络服务很陌生,所以请善待。

我编写了一个简单的 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;
    }

}

我从 ac# 客户端调用服务:

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

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

pr = db.getProject();

当我调试时,响应为空。在java端,当我调用getProject时,项目对象为null。

发生了什么?如何在服务调用之间保留项目状态?

4

2 回答 2

0

我不确定为什么@shivaspk 留下评论而不是写答案,这是非常正确的:Web 服务调用(不仅仅是轴调用)是无状态的,所以虽然项目对象是由

db.login();

你打电话时

db.getProject();

它正在由 Axis 创建的数据库类的不同实例上调用,以服务于第二次调用。

您的问题没有真正好的答案,除非您重新考虑您要做什么。如果您需要某种身份验证(通过登录),那么该身份验证需要成为每个 Web 服务调用的一部分。

于 2009-09-15T15:09:06.130 回答
0

对于大多数工具包,Web 服务默认是无状态的。我认为轴没有什么不同。

如果您想在通话之间保持状态,则需要启用会话。可以在以下位置找到有关如何在轴中维护会话的示例:

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

在 .NET 方面,您需要将 CookieContainer 分配给您的请求以存储会话标识符。有关详细信息,请参阅如何:使用 CookieContainer 维护 Web 服务中的状态

我认为您的代码看起来像这样:

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


我认为这应该让你做你想做的事——但我不推荐它

设计服务接口与设计面向对象的接口有点不同。服务接口通常避免使用状态,而是要求消费者在请求中提供所有相关信息。

面向服务的架构

服务应该是独立的、自包含的请求,在实现时不需要从一个请求到另一个请求的信息或状态。

我肯定会推荐阅读那篇文章,也许重新审视你的设计。

于 2009-09-15T15:10:00.417 回答