我不了解TIdHTTPServer中TIdHTTPSession的概念。这是为了什么它是一种用于请求的容器,还是什么?启用AutoSessionStart
后如何正确使用它?如果我不启用AutoSessions
,会发生什么?
例如,假设我们有一些共享资源FMyMessages: TStringList;
,那么我应该如何在有/没有会话的情况下请求此共享资源?
TIdHTTPSession
有一个FLock: TIdCriticalSection;
成员-因此,如果我有FMyMessages
,也许我应该使用它来将共享资源AutoSessions
与其他线程锁定,否则应该使用自己的关键部分?
此外,我现在该如何计算会话数?我这样尝试过,但是不起作用:
Server.Contexts.Count.ToString;
答案 0 :(得分:1)
我不了解TIdHTTPServer中TIdHTTPSession的概念吗?这是为了什么它是一种用于请求的容器,还是什么?启用
AutoSessionStart
后如何正确使用它?
HTTP是无状态协议。它不会记住从一个请求到下一个请求的信息。而且它甚至不能保证或要求TCP连接本身在请求之间保持打开状态。
这是会话起作用的地方。服务器可以创建一个会话对象来存储信息,例如在客户端登录期间,并且该会话的唯一ID通过HTTP cookie发送给客户端,客户端可以在后续请求中将其发送回服务器以重用同一会话。宾语。最终,如果您未明确结束会话(例如在客户端注销期间),会话将超时并被破坏。
如果我不启用
AutoSessions
,会发生什么?
如果每个请求都不存在,服务器将不会自动自动创建一个新的会话对象。您将不得不根据需要手动创建一个新会话。
例如,假设我们有一些共享资源
FMyMessages: TStringList;
,那么我应该如何在有/没有会话的情况下请求此共享资源?
会话与访问共享资源无关,而与持久保存每个客户端状态数据无关。例如用户登录名,数据库连接等。
TIdHTTPSession
有一个FLock: TIdCriticalSection;
成员-因此,如果我有FMyMessages
,也许我应该使用它来将共享资源AutoSessions
与其他线程锁定,否则应该使用自己的关键部分?
不。您可以改用Indy的TIdThreadSafeStringList
。
此外,我现在该如何计算会话数?我这样尝试过,但是不起作用:
Server.Contexts.Count.ToString;
Contexts
属性存储活动的客户端TCP连接。这与HTTP会话无关。那些存储在服务器的SessionList
属性中。