我正在尝试在一个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"))
}
答案 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的会话管理。