forked from SAP/odata-vocabularies
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Session.xml
167 lines (134 loc) · 8.51 KB
/
Session.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
<edmx:Include Alias="Core" Namespace="Org.OData.Core.V1" />
</edmx:Reference>
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Common.xml">
<edmx:Include Namespace="com.sap.vocabularies.Common.v1" Alias="Common" />
</edmx:Reference>
<edmx:DataServices>
<Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="com.sap.vocabularies.Session.v1" Alias="Session">
<Annotation Term="Core.Description">
<String>Terms for services supporting sticky sessions for data modification</String>
</Annotation>
<Annotation Term="Core.Description" Qualifier="Published">
<String>2018-07-26 © Copyright 2018 SAP SE. All rights reserved</String>
</Annotation>
<Annotation Term="Core.Links">
<Collection>
<Record>
<PropertyValue Property="rel" String="latest-version" />
<PropertyValue Property="href" String="https://sap.github.io/odata-vocabularies/vocabularies/Session.xml" />
</Record>
<Record>
<PropertyValue Property="rel" String="alternate" />
<PropertyValue Property="href" String="https://sap.github.io/odata-vocabularies/vocabularies/Session.json" />
</Record>
<Record>
<PropertyValue Property="rel" String="describedby" />
<PropertyValue Property="href" String="https://github.com/sap/odata-vocabularies/blob/main/vocabularies/Session.md" />
</Record>
</Collection>
</Annotation>
<Annotation Term="Core.LongDescription">
<String>
Building REST APIs on top of ABAP code that has been written for classic session-based communication is hard and sometimes not economically feasible.
HTTP is not connection-based, meaning that each request may be sent over a different TCP connection.
Adding scalable servers and load balancers into the mix, each individual HTTP request is typically answered by a different application server instance.
Sticky sessions to the rescue: session stickiness or session affinity is a mechanism to route (HTTP) calls from the same client instance to the same "session",
"work process", or "application instance". This is a performance improvement measure because it allows the server to keep server state in process-specific memory.
This process-specific memory is lost if the server process instance crashes, in which case the client is redirected to another process instance.
In modern, scalable server environments sticky sessions are usually combined with a persistency service to allow recovering session state after
a process instance crash, so from the client's perspective the server state is kept. In the case of ABAP servers the session state is simply lost.
Session stickiness is usually achieved via a cookie containing the session id. This has the benefit that browser-based applications don't need to be aware
of the session stickiness because browsers automatically send cookies on subsequent requests.
However, cookies are shared across browser tabs and windows, and requests from different tabs or windows would be dispatched to the same server session.
Again this poses a problem for classic ABAP code which was built under the assumption that each server session is tied to at most one client instance.
This means that the client application has to be aware of the service's limitations and cooperate to route calls from each client application instance (browser tab or window)
to a different server session. The ABAP server allows this by sending the session id in the response header `sap-contextid`,
which client application instances will need to echo as a request header in subsequent requests.
Also the client needs to adhere to a strict choreography of
- initiate session
- send data modification and read requests
- end session by either
- confirm data modification or
- discard changes
This choreography is (intentionally) similar to the choreography for [Draft Handling](https://experience.sap.com/fiori-design-web/draft-handling/).
Data modification requests outside of a session are allowed and have their usual OData semantics.
This allows e.g. using the same service for a list report with actions and for an editable object page,
combined as one UI app.
</String>
</Annotation>
<Term Name="StickySessionSupported" Type="Session.StickySessionSupportedType" Nullable="false" AppliesTo="EntitySet">
<Annotation Term="Core.Description" String="The annotated entity set allows data modification only within a sticky session" />
<Annotation Term="Core.Example">
<Record>
<Annotation Term="Session.SessionOnlyStateSupported">
<Record>
<PropertyValue Property="NewAction" String="..." />
<PropertyValue Property="EditAction" String="..." />
<PropertyValue Property="SaveAction" String="..." />
<PropertyValue Property="DiscardAction" String="..." />
</Record>
</Annotation>
</Record>
</Annotation>
</Term>
<ComplexType Name="StickySessionSupportedType">
<Annotation Term="Core.Description" String="Actions for managing data modification within a sticky session" />
<Property Name="NewAction" Type="Common.QualifiedName" Nullable="false">
<Annotation Term="Core.Description" String="Bound action that initiates a sticky session for creating new entities in the targeted entity set or collection" />
<Annotation Term="Core.LongDescription">
<String>Signature:
- Binding parameter is collection of type of annotated entity set
- No non-binding parameters
- No return type
If called within a sticky session the sticky session continues.
Otherwise:
- On success this action initiates a sticky session.
- On failure no sticky session is initiated.</String>
</Annotation>
</Property>
<Property Name="AdditionalNewActions" Type="Collection(Common.QualifiedName)" Nullable="false">
<Annotation Term="Common.Experimental" />
<Annotation Term="Core.Description" String="Additional bound actions that initiate a sticky session" />
<Annotation Term="Core.LongDescription" String="Actions have the same binding parameter as the `NewAction` and may have non-binding paramters" />
</Property>
<Property Name="EditAction" Type="Common.QualifiedName" Nullable="false">
<Annotation Term="Core.Description" String="Bound action that initiates a sticky session for editing the targeted entity" />
<Annotation Term="Core.LongDescription">
<String>Signature:
- Binding parameter is type of annotated entity set
- No non-binding parameters
- Return type is same as binding parameter type
If called within a sticky session the sticky session continues.
Otherwise:
- On success this action returns the targeted entity and initiates a sticky session.
- On failure no sticky session is initiated.</String>
</Annotation>
</Property>
<Property Name="SaveAction" Type="Common.QualifiedName" Nullable="false">
<Annotation Term="Core.Description" String="Bound action that saves a new or edited entity" />
<Annotation Term="Core.LongDescription">
<String>Signature:
- Binding parameter is type of annotated entity set
- No non-binding parameters
- Return type is same as binding parameter type
On success this action returns the newly created or edited entity. The sticky session is terminated after all entities that were newly created or edited in it have been saved.
On failure the sticky session is kept alive.</String>
</Annotation>
</Property>
<Property Name="DiscardAction" Type="Core.SimpleIdentifier" Nullable="false">
<Annotation Term="Core.Description" String="Action import for an unbound action that discards all changes and terminates the sticky session" />
<Annotation Term="Core.LongDescription">
<String>Signature:
- No parameters
- No return type
If called within a sticky session the sticky session is terminated, irrespective of whether the action succeeds or fails.
If called outside of a sticky session the action fails and does not initiate a session.</String>
</Annotation>
</Property>
</ComplexType>
</Schema>
</edmx:DataServices>
</edmx:Edmx>