Skip to content

Instantly share code, notes, and snippets.

@sniffdk
Last active February 28, 2022 10:03
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save sniffdk/7600822 to your computer and use it in GitHub Desktop.
Save sniffdk/7600822 to your computer and use it in GitHub Desktop.
Fake an UmbracoContext for use when doing published scheduling or other scenarios where UmbracoContext is normally null.
public class ContextHelpers
{
public static UmbracoContext EnsureUmbracoContext() {
if (UmbracoContext.Current != null)
{
return UmbracoContext.Current;
}
var httpContext = new HttpContextWrapper(HttpContext.Current ?? new HttpContext(new SimpleWorkerRequest("temp.aspx", "", new StringWriter())));
/* v7.3+ */
return UmbracoContext.EnsureContext(
httpContext,
ApplicationContext.Current,
new WebSecurity(httpContext, ApplicationContext.Current),
UmbracoConfig.For.UmbracoSettings(),
UrlProviderResolver.Current.Providers,
false);
/* v6.1.4 - v7.2.8 */
return UmbracoContext.EnsureContext(httpContext, ApplicationContext.Current, new WebSecurity(httpContext, ApplicationContext.Current), false);
/* v6.1.3 and earlier (I think) */
return (typeof(UmbracoContext)
.GetMethods(BindingFlags.Static | BindingFlags.NonPublic)
.First(x => x.GetParameters().Count() == 3)
.Invoke(null, new object[] { httpContext, ApplicationContext.Current, false })) as UmbracoContext;
}
}
public class EventHooks : ApplicationEventHandler
{
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
base.ApplicationStarted(umbracoApplication, applicationContext);
Umbraco.Core.Services.ContentService.Published += (sender, args) =>
{
using (var umbracoContext = SiteHelpers.EnsureUmbracoContext())
{
var helper = new UmbracoHelper(umbracoContext);
foreach (var content in args.PublishedEntities)
{
var publishedContent = helper.TypedContent(content.Id);
var url = publishedContent.Url;
// do something with that url
...
}
}
};
}
}
@MichaelaIvanova
Copy link

Hi @Shazwazza,

Is is OK to have set up like this using Autofac:

 builder.Register(c => UmbracoContext.Current).InstancePerRequest();
 builder.Register(x => new UmbracoHelper(UmbracoContext.Current)).InstancePerRequest();

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment