From 338e1e0d6dcb2fbac569e72661ce89201e733c1d Mon Sep 17 00:00:00 2001 From: Zeegaan <70372949+Zeegaan@users.noreply.github.com> Date: Tue, 3 Aug 2021 14:04:19 +0200 Subject: [PATCH] https://github.com/umbraco/Umbraco-CMS/issues/10699 Changed HasSet to ConcurrentHashSet and changed Add method to TryAdd in AspNetCoreHostingEnviroment.EnsureApplicationMainUrl() to fix concurrency errors --- .../AspNetCoreHostingEnvironmentTests.cs | 11 +++++++++++ .../AspNetCore/AspNetCoreHostingEnvironment.cs | 12 ++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/AspNetCoreHostingEnvironmentTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/AspNetCoreHostingEnvironmentTests.cs index fe9796251e..b0400f5e96 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/AspNetCoreHostingEnvironmentTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/AspNetCoreHostingEnvironmentTests.cs @@ -2,6 +2,7 @@ // See LICENSE for more details. using System; +using System.Threading.Tasks; using NUnit.Framework; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Tests.UnitTests.AutoFixture; @@ -36,5 +37,15 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Website Assert.AreEqual("~/Views/Template.cshtml", PathUtility.EnsurePathIsApplicationRootPrefixed("/Views/Template.cshtml")); Assert.AreEqual("~/Views/Template.cshtml", PathUtility.EnsurePathIsApplicationRootPrefixed("~/Views/Template.cshtml")); } + + [AutoMoqData] + [Test] + public void EnsureApplicationMainUrl(AspNetCoreHostingEnvironment sut) + { + var url = new Uri("http://localhost:5000"); + sut.EnsureApplicationMainUrl(url); + Assert.AreEqual(sut.ApplicationMainUrl, url); + + } } } diff --git a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs index 2689f6f6b3..4ab50ecdc1 100644 --- a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs +++ b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Options; +using Umbraco.Cms.Core.Collections; using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Extensions; @@ -13,7 +15,7 @@ namespace Umbraco.Cms.Web.Common.AspNetCore { public class AspNetCoreHostingEnvironment : IHostingEnvironment { - private readonly ISet _applicationUrls = new HashSet(); + private readonly ConcurrentHashSet _applicationUrls = new ConcurrentHashSet(); private readonly IServiceProvider _serviceProvider; private readonly IOptionsMonitor _hostingSettings; private readonly IOptionsMonitor _webRoutingSettings; @@ -168,6 +170,7 @@ namespace Umbraco.Cms.Web.Common.AspNetCore // (this is a simplified version of what was in 7.x) // note: should this be optional? is it expensive? + if (currentApplicationUrl is null) { return; @@ -181,9 +184,10 @@ namespace Umbraco.Cms.Web.Common.AspNetCore var change = !_applicationUrls.Contains(currentApplicationUrl); if (change) { - _applicationUrls.Add(currentApplicationUrl); - - ApplicationMainUrl = currentApplicationUrl; + if (_applicationUrls.TryAdd(currentApplicationUrl)) + { + ApplicationMainUrl = currentApplicationUrl; + } } } }