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