c#客户端调用java axis2 web服务,对象“重置”

时间:2009-09-15 12:33:29

标签: c# java web-services 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;
    }

}

我从c#客户端调用该服务:

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

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

pr = db.getProject();

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

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

2 个答案:

答案 0 :(得分:0)

我不确定为什么@shivaspk留下评论而不是写答案,这是完全正确的:Web服务调用(不仅仅是轴调用)意味着无状态,所以尽管项目对象是由

db.login();

致电

db.getProject();

在Axis创建的另一个Database类实例上调用它来为第二个调用提供服务。

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

答案 1 :(得分:0)

对于大多数工具包,默认情况下Web服务是无状态的。我认为轴也不例外。

如果要在两次通话之间保持状态,则需要启用会话。有关如何在轴上维护会话的示例,请访问:

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

在.NET端,您需要为您的请求分配CookieContainer以存储会话标识符。有关详细信息,请参阅HOW TO: Use CookieContainer to Maintain a State in Web Services

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

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


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

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

来自Service-Oriented Architecture

  

服务应该是独立的,   自包含的请求,但没有   从一个需要信息或状态   在实施时请求另一个人。

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