我试图在一个web方法中设置一些会话信息,并在另一个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"))
}
要将会话与Cache web服务一起使用,您需要将web服务类的SOAPSSION类参数设置为1。
这样做将导致web服务在响应中返回SOAP会话头。如果您使用的客户端是为预期此标头而构建的,则可能不需要设置任何其他内容。否则,您的客户端应用程序将不得不读取此标头,并将其包含在所有进一步的请求中,这样服务器才能知道您正在使用哪个会话。文档中给出的这个标题的示例是:
<csp:CSPCHD xmlns:csp="http://www.intersystems.com/SOAPheaders">value of
CPSCHD token</csp:CSPCHD>
请注意,安全性是一个单独的问题,您的示例没有解决这个问题。
还要注意的是,Intersystems已经决定,在发出呼叫后的一段时间内,网络服务将继续使用许可证。我找不到这方面的文档,我相信每次通话大约需要几秒钟。我认为,如果您使用其他软件来提供web服务,并且让其他软件通过web服务以外的某种机制调用Cache,这可能会导致许可证问题,而这些问题不会发生。我相信这是真的,即使其他软件认真遵守许可协议中关于命名和匿名用户的所有规则。然而,我不确定这些许可证的内容。尽管如此,您可能需要在提交架构之前进行一些测试。
作为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的会话管理。