1

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

Web 方法 1 - 设置会话信息

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

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

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

2 回答 2

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,则不会发生许可证问题。我相信即使其他软件仔细遵循许可协议中关于命名用户和匿名用户的所有规则也是如此。但是,我不确定这些许可的任何内容。不过,您可能希望在提交架构之前进行一些测试。

于 2012-10-08T20:42:44.100 回答
0

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

例如:

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

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

在 web 方法中这样做:

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 的会话管理。

于 2012-10-10T21:06:41.997 回答