Skip to content

Commit

Permalink
Fixes a threading issue in the LayerFilter. (#17540)
Browse files Browse the repository at this point in the history
  • Loading branch information
gvkries authored Mar 3, 2025
1 parent 0edcac8 commit b949198
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Caching.Memory;
using OrchardCore.Admin;
using OrchardCore.ContentManagement;
using OrchardCore.ContentManagement.Display;
using OrchardCore.ContentManagement.Metadata;
using OrchardCore.ContentManagement.Metadata.Models;
Expand Down Expand Up @@ -124,18 +125,21 @@ public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultE
if (widgetDefinitions.TryGetValue(widget.ContentItem.ContentType, out var definition) &&
(!definition.IsSecurable() || await _authorizationService.AuthorizeAsync(context.HttpContext.User, CommonPermissions.ViewContent, widget.ContentItem)))
{
var widgetContent = await _contentItemDisplayManager.BuildDisplayAsync(widget.ContentItem, updater);
// Note: We clone the cached content item to avoid sharing the same instance across threads when rendering widgets.
var contentItem = widget.ContentItem.Clone();

var widgetContent = await _contentItemDisplayManager.BuildDisplayAsync(contentItem, updater);

widgetContent.Classes.Add("widget");
widgetContent.Classes.Add("widget-" + widget.ContentItem.ContentType.HtmlClassify());
widgetContent.Classes.Add("widget-" + contentItem.ContentType.HtmlClassify());

var wrapper = new WidgetWrapper
{
Widget = widget.ContentItem,
Widget = contentItem,
Content = widgetContent
};

wrapper.Metadata.Alternates.Add("Widget_Wrapper__" + widget.ContentItem.ContentType);
wrapper.Metadata.Alternates.Add("Widget_Wrapper__" + contentItem.ContentType);
wrapper.Metadata.Alternates.Add("Widget_Wrapper__Zone__" + widget.Zone);

var contentZone = layout.Zones[widget.Zone];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,4 +228,29 @@ public static ContentItem Merge(this ContentItem contentItem, object properties,

return contentItem;
}

/// <summary>
/// Creates an in-memory clone of a content item.
/// </summary>
/// <param name="contentItem"></param>
/// <returns></returns>
public static ContentItem Clone(this ContentItem contentItem)
{
return new ContentItem
{
Id = contentItem.Id,
ContentItemId = contentItem.ContentItemId,
ContentItemVersionId = contentItem.ContentItemVersionId,
ContentType = contentItem.ContentType,
DisplayText = contentItem.DisplayText,
Owner = contentItem.Owner,
Author = contentItem.Author,
Published = contentItem.Published,
Latest = contentItem.Latest,
CreatedUtc = contentItem.CreatedUtc,
ModifiedUtc = contentItem.ModifiedUtc,
PublishedUtc = contentItem.PublishedUtc,
Data = contentItem.Data.Clone()
};
}
}

0 comments on commit b949198

Please sign in to comment.