[英]c# client calling java axis2 web service, object “resets”
我是Web服务人员的新手,请保持友好。
我编写了一个简单的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();
当我调试时,响应为null。 在Java端,当我调用getProject时,项目对象为null。
发生了什么? 如何在两次服务调用之间保留项目状态?
我不确定为什么@shivaspk留下评论而不是写答案,这是完全正确的:Web服务调用(不仅是轴调用)本来是无状态的,所以尽管项目对象是由创建的
db.login();
你打电话时
db.getProject();
在Axis创建的数据库类的另一个实例上调用它,以服务于第二个调用。
除了重新考虑自己想做的事情之外,您的问题没有一个很好的答案。 如果您需要某种身份验证(通过登录),则该身份验证需要成为每个Web服务调用的一部分。
对于大多数工具包,Web服务默认情况下是无状态的。 我认为轴没有什么不同。
如果要保持通话之间的状态,则需要启用会话。 有关如何在axis中维护会话的示例,请参见:
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();
我认为那应该让您做自己想做的事- 但我不建议这样做 。
设计服务接口与设计面向对象的接口有些不同。 服务接口通常避免使用状态,而是要求使用者在请求中提供所有相关信息。
从面向服务的体系结构 :
服务应该是独立的,独立的请求,在实现时,它们不需要信息或从一个请求到另一个请求的状态。
我绝对会建议您阅读该文章,并可能重新访问您的设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.