如何在Web服务中使用Intersystem的会话

时间:2012-10-08 20:08:49

标签: web-services intersystems-cache objectscript

我正在尝试在一个Web方法中设置一些会话信息并在另一个Web方法中返回它,但会话数据在第二个Web方法上始终为空。这是我试过的

网络方法1 - 设置会话信息

Method StartSession() As %String [WebMethod]
{
     set %session.NewSession = 1
     set %session.Data("key") = "dude"
     Quit "Session Started"
}

Web方法2 - 获取会话信息应返回dude,但返回空白

Method TestSession() As %String [WebMethod]
{
    Quit $Get(%session.Data("key"))         
}

2 个答案:

答案 0 :(得分:1)

要使用具有缓存Web服务的会话,您需要将Web服务类的SOAPSESSION类参数设置为1。

这样做会导致Web服务在响应中返回SOAP会话标头。如果您使用的是构建为期望此标头的客户端,则可能不需要设置其他任何内容。否则,您的客户端应用程序必须读取此标头并将其包含在所有其他请求中,以便服务器可以知道您正在使用哪个会话。文档中给出的此标头的示例是:

<csp:CSPCHD xmlns:csp="http://www.intersystems.com/SOAPheaders">value of
CPSCHD token</csp:CSPCHD>

请注意,安全性是您的示例无法解决的单独问题。

另请注意,Intersystems已决定在呼叫完成后,Web服务将在一段时间内继续使用许可证。我找不到关于此的文档,我相信每次通话只需几秒钟。我相信这会导致许可证问题,如果您使用其他软件提供Web服务就不会发生这种情况,并且其他软件通过Web服务以外的某种机制调用Cache。即使其他软件仔细遵循许可协议中有关命名和匿名用户的所有规则,我也相信这是真的。但是,我不确定这些授权内容是什么。不过,您可能希望在提交体系结构之前进行一些测试。

答案 1 :(得分:0)

作为psr答案的替代方法,处理状态的另一种方法是使用自定义SOAP标头。

例如:

为您的自定义SOAP标头创建一个类,如下所示:

Class Headers.TimeStamp Extends %SOAP.Header
{
     Property TimeSent As %TimeStamp;    
}

在网络方法中执行以下操作:

set h=##class(Headers.TimeStamp).%New()
set h.TimeSent=$ZTIMESTAMP
do ..HeadersOut.SetAt(h,"Timestamp")

这将生成以下SOAP标头:

  <SOAP-ENV:Header>
    <TimeStamp xmlns:hdr="http://www.myapp.org">
      <TimeSent>60712,70996.027Z</TimeSent>
    </TimeStamp>  
  </SOAP-ENV:Header>

这将允许在SOAP标头内维护状态,而不是使用Cache的会话管理。