Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Emil Lindgren 28 posts 190 karma points
    Jul 19, 2019 @ 08:56
    Emil Lindgren
    0

    Hello, so im wonderinmg if somone could help me to read a error message.

    I know its a null referenceException but i dont know where it comes from. What i can read from it its about some Template? or am i reading it wrong?

    An unhandled exception occurred
    System.NullReferenceException: Object reference not set to an instance of an object.
       at Umbraco.Web.PublishedContentExtensions.IsAllowedTemplate(IPublishedContent content, Int32 templateId)
       at Umbraco.Web.Routing.ContentFinderByNiceUrlAndTemplate.TryFindContent(PublishedContentRequest docRequest)
       at Umbraco.Web.Routing.ContentFinderByNotFoundHandlers.HandlePageNotFound(PublishedContentRequest docRequest)
       at Umbraco.Web.Routing.ContentFinderByNotFoundHandlers.TryFindContent(PublishedContentRequest docRequest)
       at Umbraco.Web.Routing.PublishedContentRequestEngine.<FindPublishedContent>b__17_0(IContentFinder finder)
       at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
       at Umbraco.Web.Routing.PublishedContentRequestEngine.FindPublishedContent()
       at Umbraco.Web.Routing.PublishedContentRequestEngine.FindPublishedContentAndTemplate()
       at Umbraco.Web.Routing.PublishedContentRequestEngine.PrepareRequest()
       at Umbraco.Web.UmbracoModule.ProcessRequest(HttpContextBase httpContext)
       at Umbraco.Web.UmbracoModule.<Init>b__12_3(Object sender, EventArgs e)
       at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
       at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
       at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
    

    Kind regards/ Emil

  • Marc Goodson 2141 posts 14344 karma points MVP 8x c-trib
    Jul 21, 2019 @ 07:58
    Marc Goodson
    100

    Hi Emil

    The key to understanding this error message is to know which url triggers it, eg is it on all requests or are you finding it for a particular page, or just seeing it in the logs from time to time?

    Essentially if the Url that triggers the problem is

    /about-us/contactus

    Then what happens when a request comes into Umbraco, is Umbraco needs to find the published content item that matches to the incoming Url. A series of 'finding rules' - called ContentFinders are executed one after another until a matching content item is found.

    In your tracelog error, you can see Umbraco gets as far through this list as

    ContentFinderByNiceUrlAndTemplate

    and the error message is triggered when checking whether the template 'is allowed' for a content item.

    This ContentFinder is one of the very last rules to execute before returning a 404 for the request, and is performing a check for an obscure Umbraco convention called 'altTemplate' (which enables you to force a particular page to load with a different template than the one it is published with by adding ?altTemplate to the querystring - and there is a shortcut for this convention, to avoid using the querystring to just have the name of the template as the last segment).

    So in our example of /about-us/contactus

    You'd expect to see in the Umbraco Content tree, an 'about-us' node and underneath this a 'contactus' node... however if there is no 'contactus' node AND there is a template called 'contactus' - this instruction will load the 'about-us' page and force it to use the 'contactus' template.

    You can turn this convention 'off' by updating the setting disabledAlternativeTemplates in /config/umbracosettings.config

    <web.routing
        trySkipIisCustomErrors="false"
        internalRedirectPreservesTemplate="false"
        disableAlternativeTemplates="true"
        disableFindContentByIdPath="false"
        disableRedirectUrlTracking="false"
        umbracoApplicationUrl=""
    />
    

    Now back to your error... a while back it was pointed out that this default convention could be used by a hacker to show the contents of a template that they shouldn't have permissions to access - and so a check to make sure the template 'IsAllowed' was added.... and this is where your error is being triggered...

    if you have a look at the Umbraco Source code for ContentFinderByNiceUrlAndTemplate...

    https://github.com/umbraco/Umbraco-CMS/blob/v7/dev/src/Umbraco.Web/Routing/ContentFinderByNiceUrlAndTemplate.cs#L39

    You can hopefully see,that for the incoming request the template name is taken from the last segment, and used to find a matching template on disk, if one exists, then an Umbraco node is sought at the url, without the template segment, and then it's checked whether the template is allowed for that content node... however no null check is made for this node without the template segment, so if one isn't matched... the error message you are seeing is thrown!

    so in our /about-us/contactus example, it would mean there IS a template called 'contactus' and Umbraco removes contactus from the Url and looks for content at /about-us... and there isn't any! so the check for IsAllowedTemplate triggers the error.

    So in your circumstance to make the errors go away, if you don't use or plan to use the alternative templates convention you can disable the convention n the umbracosettings.config file... if you do need the convention then try to make sure your templates are named with 'possible' matches to content, eg called the template: ContactUsPage, and not ContactUs... to prevent accidental occurences.... and I guess we should try to put the Null check into future versions of Umbraco! (I have checked and it's fixed in Umbraco V8!)

    regards

    Marc

  • Jonas Söderström 8 posts 78 karma points
    Nov 11, 2019 @ 06:53
    Jonas Söderström
    0

    Hi Marc,

    Do you have an ETA for the null check in V7?

    Kind regards, Jonas

  • Marc Goodson 2141 posts 14344 karma points MVP 8x c-trib
    Nov 13, 2019 @ 17:28
    Marc Goodson
    0

    There is a PR here Jonas:

    https://github.com/umbraco/Umbraco-CMS/pull/7150

    if that helps, you could take the code from there now, and then remove the existing Umbraco implementation of ContentFinderByNiceUrlAndTemplate from the stack of registered ContentFinders and add your own MySuperContentFinderByNiceUrlAndTemplate in the queue in it's place.

    https://our.umbraco.com/Documentation/Reference/Routing/Request-Pipeline/IContentFinder-v7

    if that helps!

    regards

    Marc

Please Sign in or register to post replies

Write your reply to:

Draft