Skip to content

Commit cda89e9

Browse files
authored
Remove public constructor from HttpSessionState (#553)
There was no public constructor for this on framework. This was added initially as a way to override the current session implementation. However, now it can be changed by setting `HttpContext.Features.Get<ISessionStateFeature>().State` and it will be propagated in the session. This is a breaking change, but we're already doing that for a few other APIs for v2. This will help guide people to the recommended approach to override behavior.
1 parent daa6255 commit cda89e9

File tree

3 files changed

+29
-26
lines changed

3 files changed

+29
-26
lines changed

src/Microsoft.AspNetCore.SystemWebAdapters/SessionState/HttpSessionState.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,14 @@ namespace System.Web.SessionState;
1111
[Diagnostics.CodeAnalysis.SuppressMessage("Naming", "CA1710:Identifiers should have correct suffix", Justification = Constants.ApiFromAspNet)]
1212
public class HttpSessionState : ICollection
1313
{
14-
private readonly Func<ISessionState> _state;
14+
private readonly ISessionStateFeature _feature;
1515

1616
internal HttpSessionState(ISessionStateFeature feature)
1717
{
18-
_state = () => feature.State ?? throw new InvalidOperationException("Session state is no longer available");
18+
_feature = feature;
1919
}
2020

21-
public HttpSessionState(ISessionState container)
22-
{
23-
_state = () => container;
24-
}
25-
26-
internal ISessionState State => _state();
21+
internal ISessionState State => _feature.State ?? throw new InvalidOperationException("Session state is no longer available");
2722

2823
public string SessionID => State.SessionID;
2924

test/Microsoft.AspNetCore.SystemWebAdapters.Tests/HttpContextTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ public void NonClaimsPrincipalIsCopied()
144144
public void GetServiceReturnsExpected()
145145
{
146146
var coreContext = new DefaultHttpContext();
147-
coreContext.Features.Set(new HttpSessionState(new Mock<ISessionState>().Object));
148147

149148
var context = new HttpContext(coreContext);
150149
var provider = (IServiceProvider)context;

test/Microsoft.AspNetCore.SystemWebAdapters.Tests/SessionState/HttpSessionStateTests.cs

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Linq;
55
using System.Web.SessionState;
66
using AutoFixture;
7+
using Microsoft.AspNetCore.SystemWebAdapters.Features;
78
using Moq;
89
using Xunit;
910

@@ -27,7 +28,7 @@ public void SessionId()
2728
var session = new Mock<ISessionState>();
2829
session.Setup(s => s.SessionID).Returns(id);
2930

30-
var state = new HttpSessionState(session.Object);
31+
var state = CreateSession(session.Object);
3132

3233
// Act
3334
var result = state.SessionID;
@@ -42,7 +43,7 @@ public void Mode()
4243
// Arrange
4344
var session = new Mock<ISessionState>();
4445

45-
var state = new HttpSessionState(session.Object);
46+
var state = CreateSession(session.Object);
4647

4748
// Act
4849
var result = state.Mode;
@@ -60,7 +61,7 @@ public void Count()
6061
var session = new Mock<ISessionState>();
6162
session.Setup(s => s.Count).Returns(count);
6263

63-
var state = new HttpSessionState(session.Object);
64+
var state = CreateSession(session.Object);
6465

6566
// Act
6667
var result = state.Count;
@@ -78,7 +79,7 @@ public void IsReadOnly(bool isReadOnly)
7879
var session = new Mock<ISessionState>();
7980
session.Setup(s => s.IsReadOnly).Returns(isReadOnly);
8081

81-
var state = new HttpSessionState(session.Object);
82+
var state = CreateSession(session.Object);
8283

8384
// Act
8485
var result = state.IsReadOnly;
@@ -96,7 +97,7 @@ public void IsNewSession(bool isNewSession)
9697
var session = new Mock<ISessionState>();
9798
session.Setup(s => s.IsNewSession).Returns(isNewSession);
9899

99-
var state = new HttpSessionState(session.Object);
100+
var state = CreateSession(session.Object);
100101

101102
// Act
102103
var result = state.IsNewSession;
@@ -116,7 +117,7 @@ public void TimeOut()
116117
session.SetupProperty(s => s.Timeout);
117118
session.Object.Timeout = timeout1;
118119

119-
var state = new HttpSessionState(session.Object);
120+
var state = CreateSession(session.Object);
120121

121122
// Act
122123
var result = state.Timeout;
@@ -136,7 +137,7 @@ public void IsSynchronized(bool isSynchronized)
136137
var session = new Mock<ISessionState>();
137138
session.Setup(s => s.IsSynchronized).Returns(isSynchronized);
138139

139-
var state = new HttpSessionState(session.Object);
140+
var state = CreateSession(session.Object);
140141

141142
// Act
142143
var result = state.IsSynchronized;
@@ -153,7 +154,7 @@ public void SyncRoot()
153154
var session = new Mock<ISessionState>();
154155
session.Setup(s => s.SyncRoot).Returns(sync);
155156

156-
var state = new HttpSessionState(session.Object);
157+
var state = CreateSession(session.Object);
157158

158159
// Act
159160
var result = state.SyncRoot;
@@ -169,7 +170,7 @@ public void Abandon()
169170
var session = new Mock<ISessionState>();
170171
session.SetupProperty(s => s.IsAbandoned);
171172

172-
var state = new HttpSessionState(session.Object);
173+
var state = CreateSession(session.Object);
173174

174175
// Act
175176
state.Abandon();
@@ -188,7 +189,7 @@ public void Get()
188189
var session = new Mock<ISessionState>();
189190
session.Setup(s => s[key]).Returns(value);
190191

191-
var state = new HttpSessionState(session.Object);
192+
var state = CreateSession(session.Object);
192193

193194
// Act
194195
var result = state[key];
@@ -206,7 +207,7 @@ public void Set()
206207

207208
var session = new Mock<ISessionState>();
208209

209-
var state = new HttpSessionState(session.Object);
210+
var state = CreateSession(session.Object);
210211

211212
// Act
212213
state[key] = value;
@@ -223,7 +224,7 @@ public void Add()
223224
var value = new object();
224225

225226
var session = new Mock<ISessionState>();
226-
var state = new HttpSessionState(session.Object);
227+
var state = CreateSession(session.Object);
227228

228229
// Act
229230
state.Add(key, value);
@@ -239,7 +240,7 @@ public void Remove()
239240
var key = _fixture.Create<string>();
240241

241242
var session = new Mock<ISessionState>();
242-
var state = new HttpSessionState(session.Object);
243+
var state = CreateSession(session.Object);
243244

244245
// Act
245246
state.Remove(key);
@@ -255,7 +256,7 @@ public void RemoveAll()
255256
var key = _fixture.Create<string>();
256257

257258
var session = new Mock<ISessionState>();
258-
var state = new HttpSessionState(session.Object);
259+
var state = CreateSession(session.Object);
259260

260261
// Act
261262
state.RemoveAll();
@@ -271,7 +272,7 @@ public void Clear()
271272
var key = _fixture.Create<string>();
272273

273274
var session = new Mock<ISessionState>();
274-
var state = new HttpSessionState(session.Object);
275+
var state = CreateSession(session.Object);
275276

276277
// Act
277278
state.Clear();
@@ -289,7 +290,7 @@ public void GetEnumerator()
289290
var session = new Mock<ISessionState>();
290291
session.Setup(s => s.Keys).Returns(keys);
291292

292-
var state = new HttpSessionState(session.Object);
293+
var state = CreateSession(session.Object);
293294

294295
// Act
295296
var result = state.GetEnumerator();
@@ -320,7 +321,7 @@ public void CopyTo()
320321
session.Setup(s => s[key1]).Returns(item1);
321322
session.Setup(s => s[key2]).Returns(item2);
322323

323-
var state = new HttpSessionState(session.Object);
324+
var state = CreateSession(session.Object);
324325
var array = new object[3];
325326

326327
// Act
@@ -332,4 +333,12 @@ public void CopyTo()
332333
item => Assert.Equal(item1, item),
333334
item => Assert.Equal(item2, item)); ;
334335
}
336+
337+
private static HttpSessionState CreateSession(ISessionState session)
338+
{
339+
var feature = new Mock<ISessionStateFeature>();
340+
feature.Setup(f => f.State).Returns(session);
341+
342+
return new(feature.Object);
343+
}
335344
}

0 commit comments

Comments
 (0)