State and Session Management
时间:2006-01-12 来源:cjsteven
在.NET 上, 一個 WebService Class 可以 extend System.Web.Services.WebService
來繼承使用一些ASP.NET objects: Application, Session, User, and Context
Application可以用來儲存整個 Application 的 state objects.
Session可以用來儲存每一個 Session 單獨的 state objects.
1. 紀錄ServiceUsage() 總共被用了幾次
2. 紀錄PerSessionServiceUsage() 在一個client session 中總共被用了幾次
在Java上, 一個 WebService Endpoint Implementation Class 可以 implement
javax.xml.rpc.server.ServiceLifecycle interface 的方式來得到 ServiceContext
的支援:
如果這一個 Java WebService Endpoint 是部署在的 Servlet container based
的JAXRPC runtime system上的話, init 帶的參數 context 便會是一個
javax.xml.rpc.server.ServletEndpointContext 的 instance,
透過 ServletEndpointContext, 你便可以取得
javax.servlet.http.HttpSession 及 javax.servlet.ServletContext:
然而, Session or Conversational State, 這個在WebService被認為所應具備的基本功
能上, 最主要的問題在於如何傳達 Session 的 id 以及所存在的位置, 你或許會很直觀
的認為, 既然是"Web"那當然就是 cookie, HTTP header. 目前.NET 以及一些 Java
WebServices Platform 是以 Cookie 的方式. 但是 cookie, HTTP header都是
HTTP specific, 只有 HTTP 才有的東西, 限制了WebService只能以SOAP on HTTP
的方式溝通. 但是不是也可以SOAP on SMTP 甚至 SOAP on JMS 呢?
那麼在這些以外的transport mechanism上, 是不是又要重新 implement 一套
Session 的方式呢?
比較根本的解決之道, 便是將 Session or Conversational State 這些
Service Context Information 以 XML 的格式直接寫在 SOAP message 中
(SOAP Header).
Axis 便是以 HTTP cookies 及 transport-independent SOAP headers 兩種方式
來支持 session-oriented services 但是這樣的 SOAP header 目前尚無標準化, 會有
interoperability的問題, 目前可能很難做到讓一個 Session 從 .NET 延伸到 J2EE 的
WebServices上.
來繼承使用一些ASP.NET objects: Application, Session, User, and Context
Application可以用來儲存整個 Application 的 state objects.
Session可以用來儲存每一個 Session 單獨的 state objects.
1. 紀錄ServiceUsage() 總共被用了幾次
1 |
C# using System.Web.Services; public class Usage : WebService { [WebMethod(Description="Number of times this service has been accessed.")] public int ServiceUsage() { if (Application["appMyServiceUsage"] == null){ Application["appMyServiceUsage"] = 1; } else { Application["appMyServiceUsage"] = ((int) Application["appMyServiceUsage"]) + 1; } return (int)Application["appMyServiceUsage"]; } … } |
2. 紀錄PerSessionServiceUsage() 在一個client session 中總共被用了幾次
1 |
C# using System.Web.Services; public class Usage : WebService { [WebMethod(Description="Number of times ...", EnableSession=true)] public int PerSessionServiceUsage() { if (Session["MyServiceUsage"] == null) { Session["MyServiceUsage"] = 1; } else { Session["MyServiceUsage"] = ((int) Session["MyServiceUsage"]) + 1; } return (int) Session["MyServiceUsage"]; } } |
在Java上, 一個 WebService Endpoint Implementation Class 可以 implement
javax.xml.rpc.server.ServiceLifecycle interface 的方式來得到 ServiceContext
的支援:
1 |
public interface ServiceLifecycle { void init(Object context) throws ServiceException; void destroy(); } |
如果這一個 Java WebService Endpoint 是部署在的 Servlet container based
的JAXRPC runtime system上的話, init 帶的參數 context 便會是一個
javax.xml.rpc.server.ServletEndpointContext 的 instance,
透過 ServletEndpointContext, 你便可以取得
javax.servlet.http.HttpSession 及 javax.servlet.ServletContext:
1 |
public class Hello implements ServiceLifecycle { private ServletEndpointContext servletEndpointContext; public void init(Object context) throws ServiceException { servletEndpointContext = (ServletEndpointContext)context; } public String sayHey(String str) throws javax.servlet.http.HttpSession session = context.getHttpSession(); javax.servlet.ServletContext servletContext = context.getServletContext(); ... } } |
然而, Session or Conversational State, 這個在WebService被認為所應具備的基本功
能上, 最主要的問題在於如何傳達 Session 的 id 以及所存在的位置, 你或許會很直觀
的認為, 既然是"Web"那當然就是 cookie, HTTP header. 目前.NET 以及一些 Java
WebServices Platform 是以 Cookie 的方式. 但是 cookie, HTTP header都是
HTTP specific, 只有 HTTP 才有的東西, 限制了WebService只能以SOAP on HTTP
的方式溝通. 但是不是也可以SOAP on SMTP 甚至 SOAP on JMS 呢?
那麼在這些以外的transport mechanism上, 是不是又要重新 implement 一套
Session 的方式呢?
比較根本的解決之道, 便是將 Session or Conversational State 這些
Service Context Information 以 XML 的格式直接寫在 SOAP message 中
(SOAP Header).
Axis 便是以 HTTP cookies 及 transport-independent SOAP headers 兩種方式
來支持 session-oriented services 但是這樣的 SOAP header 目前尚無標準化, 會有
interoperability的問題, 目前可能很難做到讓一個 Session 從 .NET 延伸到 J2EE 的
WebServices上.
相关阅读 更多 +