diff --git a/.gitignore b/.gitignore index e3325d77..c2f1e5bd 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ Build/BinScopeOutDir/ Build/BinScopeTargetDir/ Scripts/ +/_ReSharper.Caches/* +/.idea/* +/.vs/* diff --git a/src/RedisSessionStateProvider/RedisConnectionWrapper.cs b/src/RedisSessionStateProvider/RedisConnectionWrapper.cs index f26f83fa..5ed96592 100644 --- a/src/RedisSessionStateProvider/RedisConnectionWrapper.cs +++ b/src/RedisSessionStateProvider/RedisConnectionWrapper.cs @@ -111,8 +111,15 @@ private bool SetPrepare(ISessionStateItemCollection data, int sessionTimeout, ou valueArgs = null; if (data != null && data.Count > 0) { - ChangeTrackingSessionStateItemCollection sessionItems = (ChangeTrackingSessionStateItemCollection)data; - List list = redisUtility.GetNewItemsAsList(sessionItems); + List list; + if (data is ChangeTrackingSessionStateItemCollection sessionItems) + { + list = redisUtility.GetNewItemsAsList(sessionItems); + } + else + { + list = redisUtility.GetAllItemsAsList(data); + } if (list.Count > 0) { keyArgs = new string[] { Keys.DataKey, Keys.InternalKey }; diff --git a/src/Shared/RedisUtility.cs b/src/Shared/RedisUtility.cs index 243e261c..b94d6375 100644 --- a/src/Shared/RedisUtility.cs +++ b/src/Shared/RedisUtility.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; +using System.Web.SessionState; namespace Microsoft.Web.Redis { @@ -73,6 +74,17 @@ public List GetNewItemsAsList(ChangeTrackingSessionStateItemCollection s return list; } + public List GetAllItemsAsList(ISessionStateItemCollection sessionItems) + { + List list = new List(sessionItems.Keys.Count * 2); + foreach (string key in sessionItems.Keys) + { + list.Add(key); + list.Add(GetBytesFromObject(sessionItems[key])); + } + return list; + } + internal byte[] GetBytesFromObject(object data) { return _serializer.Serialize(data); diff --git a/test/RedisSessionStateProviderFunctionalTests/RedisSessionStateProviderFunctionalTests.cs b/test/RedisSessionStateProviderFunctionalTests/RedisSessionStateProviderFunctionalTests.cs index ec0476f1..0822ebb4 100644 --- a/test/RedisSessionStateProviderFunctionalTests/RedisSessionStateProviderFunctionalTests.cs +++ b/test/RedisSessionStateProviderFunctionalTests/RedisSessionStateProviderFunctionalTests.cs @@ -9,6 +9,8 @@ using System.Threading.Tasks; using Xunit; using System.Threading; +using System.Web; +using System.Web.SessionState; using Microsoft.AspNet.SessionState; namespace Microsoft.Web.Redis.FunctionalTests @@ -148,6 +150,20 @@ public async Task ReleaseItemExclusiveWithNullLockId() DisposeRedisConnectionWrapper(); } } + + [Fact] + public async Task SetAndReleaseItemExclusiveWithSessionStateItemCollection() + { + using (RedisServer redisServer = new RedisServer()) + { + string sessionId = ResetRedisConnectionWrapperAndConfiguration(); + RedisSessionStateProvider ssp = new RedisSessionStateProvider(); + var item = new SessionStateStoreData(new SessionStateItemCollection(), new HttpStaticObjectsCollection(), 1); + item.Items["testKey"] = "test data"; + await ssp.SetAndReleaseItemExclusiveAsync(null, sessionId, item, null, true, CancellationToken.None); + DisposeRedisConnectionWrapper(); + } + } [Fact] public async Task RemoveItemWithNullLockId()