簡體   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