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



我试图在一个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的会话管理。

相关内容

  • 没有找到相关文章

最新更新