繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM