我是网络服务的新手,所以请善待。
我编写了一个简单的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。
发生了什么事? 如何在服务调用之间保留项目状态?
答案 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:
服务应该是独立的, 自包含的请求,但没有 从一个需要信息或状态 在实施时请求另一个人。
我肯定会推荐阅读那篇文章,也许会重新审视你的设计。