Java axis2 Webサービスを呼び出すC#クライアント、オブジェクト「リセット」
-
07-07-2019 - |
質問
私は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;
}
}
C#クライアントからサービスを呼び出します:
localhost.Database db = new WindowsFormsApplication1.localhost.Database();
db.login();
localhost.getProjectResponse pr = new WindowsFormsApplication1.localhost.getProjectResponse();
pr = db.getProject();
デバッグ時に応答がヌルです。 Javaの最後でgetProjectを呼び出すと、プロジェクトオブジェクトはnullです。
何が起きているの? サービスの呼び出し間でプロジェクトの状態を保持するにはどうすればよいですか?
解決
ほとんどのツールキットでは、Webサービスはデフォルトでステートレスです。軸も同じだと思います。
呼び出し間で状態を維持する場合は、セッションを有効にする必要があります。軸でセッションを維持する方法の例は、次の場所にあります。
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();
これであなたがやりたいことをやれるはずだと思います-しかしお勧めしません
サービスインターフェースの設計は、オブジェクト指向インターフェースの設計とは少し異なります。通常、サービスインターフェイスは状態の使用を避け、代わりに、要求に関連するすべての情報を提供することを消費者に要求します。
>サービスは独立している必要があり、 自己完結型のリクエスト。 1つからの情報または状態が必要 実装時に他の人にリクエストする。
その記事を読んで、おそらくデザインを再検討することをお勧めします。
他のヒント
@shivaspkが答えを書く代わりにコメントを残した理由がわかりません。それは非常に正しいです。Webサービス呼び出し(軸呼び出しだけでなく)はステートレスであるため、プロジェクトオブジェクトはp>
db.login();
電話するとき
db.getProject();
2番目の呼び出しを処理するためにAxisによって作成されたDatabaseクラスの別のインスタンスで呼び出されています。
あなたがやろうとしていることを再考する以外には、あなたの質問に対する本当に良い答えはありません。 (ログインを介した)何らかの認証が必要な場合、その認証はすべてのWebサービス呼び出しの一部である必要があります。