Web services 如何使用系统间';web服务中的会话
我试图在一个web方法中设置一些会话信息,并在另一个web方法中返回它,但在第二个web方法中,会话数据总是空的。这是我试过的 Web方法1-设置会话信息Web services 如何使用系统间';web服务中的会话,web-services,intersystems-cache,objectscript,Web Services,Intersystems Cache,Objectscript,我试图在一个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 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"))
}
要将会话与缓存web服务一起使用,需要将web服务类的SOAPSESSION类参数设置为1 这样做将导致web服务在响应中返回SOAP会话头。如果您使用的客户机是为预期此标头而构建的,则可能不需要设置任何其他内容。否则,您的客户端应用程序将必须读取此头并将其包含在所有进一步的请求中,以便服务器能够知道您正在使用哪个会话。文档中给出的该标题示例如下:
<csp:CSPCHD xmlns:csp="http://www.intersystems.com/SOAPheaders">value of
CPSCHD token</csp:CSPCHD>
的值
CPSCHD令牌
请注意,安全性是一个单独的问题,您的示例没有解决这个问题
还要注意的是,Intersystems已经决定在调用后的一段时间内,web服务将继续使用许可证。我找不到这方面的文档,我相信每次通话只需几秒钟。我相信这会导致许可证问题,如果您使用其他软件来提供web服务,并且让其他软件通过web服务以外的某种机制调用缓存,则不会发生许可证问题。我相信这是真的,即使其他软件严格遵守许可协议中关于命名和匿名用户的所有规则。然而,我不确定这些许可的事情。不过,在提交架构之前,您可能需要进行一些测试。要将会话与缓存web服务一起使用,您需要将web服务类的SOAPSESSION类参数设置为1 这样做将导致web服务在响应中返回SOAP会话头。如果您使用的客户机是为预期此标头而构建的,则可能不需要设置任何其他内容。否则,您的客户端应用程序将必须读取此头并将其包含在所有进一步的请求中,以便服务器能够知道您正在使用哪个会话。文档中给出的该标题示例如下:
<csp:CSPCHD xmlns:csp="http://www.intersystems.com/SOAPheaders">value of
CPSCHD token</csp:CSPCHD>
的值
CPSCHD令牌
请注意,安全性是一个单独的问题,您的示例没有解决这个问题
还要注意的是,Intersystems已经决定在调用后的一段时间内,web服务将继续使用许可证。我找不到这方面的文档,我相信每次通话只需几秒钟。我相信这会导致许可证问题,如果您使用其他软件来提供web服务,并且让其他软件通过web服务以外的某种机制调用缓存,则不会发生许可证问题。我相信这是真的,即使其他软件严格遵守许可协议中关于命名和匿名用户的所有规则。然而,我不确定这些许可的事情。不过,在提交架构之前,您可能需要进行一些测试。作为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>
6071270996.027Z
这将允许在SOAP头中维护状态,而不是使用缓存的会话管理。作为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>
6071270996.027Z
这将允许在SOAP头中维护状态,而不是使用缓存的会话管理。Ah,是的。我已经阅读了关于标题部分的内容,但没有阅读任何关于SOAPSESSION参数的内容。这就是诀窍。这是在web方法调用之间保持变量值的最佳方法吗?“这是最佳方法”通常是一个棘手的问题。。。我通常使用会话ID的基本机制,它作为HTTP头传递,并用作会话数据的密钥。对于工业级应用程序,我通常使用可以更改的代码包装Intersystem的代码。因此,我可能有一个子类%SOAP.WebService,它用我自己的类替换了%session,可能是用显式属性而不是%session.Data。实际上,如果我必须使用web服务,我可能会使用其他人的web服务实现并从那里调用缓存。关于许可证升级:啊,是的。我已经阅读了关于标题部分的内容,但没有阅读任何关于SOAPSESSION参数的内容。这就是诀窍。这是在web方法调用之间保持变量值的最佳方法吗?“这是最佳方法”通常是一个棘手的问题。。。我通常使用会话ID的基本机制,它作为HTTP头传递,并用作会话数据的密钥。对于工业级应用程序,我通常使用可以更改的代码包装Intersystem的代码。因此,我可能有一个子类%SOAP.WebService,它用我自己的类替换了%session,可能是用显式属性而不是%session.Data。实际上,如果我必须使用web服务,我可能会使用其他人的web服务实现并从那里调用缓存。关于许可证升级: