Unified Search - Statistics Tracking results in error

nalinb
Member since: 2017
 

Hi,

I am using Unified Search and I want it to appear in the Statistics, so added the Track() method.

IEnumerable _SearchResults = searchClient.UnifiedSearch().For(queryString)
.InField(x => ((BasePageData)x).MetaKeywords)
.InField(x => ((BasePageData)x).MetaTitle)
.InField(x => ((BasePageData)x).MetaDescription)
.Track()
.Filter(x => !x.MatchTypeHierarchy(typeof(ImageData))).Filter(y => !y.MatchTypeHierarchy(typeof(ContainerPage)))
.Take(10).Skip((p - 1) * 10).GetResult(hitSpec, false);

The GetResult method in above statement throws exception "String reference not set to an instance of a String.\r\nParameter name: s"

Stacktrace: 

   at System.Text.Encoding.GetBytes(String s)
   at EPiServer.Find.TrackContext.HashString(String toHash)
   at EPiServer.Find.TrackContext..ctor()
   at EPiServer.Find.SearchExtensions.GetProjectedResult[TResult](ISearch`1 search, SearchContext context)
   at EPiServer.Find.SearchExtensions.GetResult(ITypeSearch`1 search, HitSpecification hitSpecification, Boolean filterForPublicSearch)
   at Trisept.Vax.Epi.ContentSite.Controllers.SearchController.PopulateViewModel(String queryString, VaxBasePageData currentPage, Int32 p) in C:\TFS\Trisept.VAX.Content\Development\Trisept.Vax.Epi\Trisept.Vax.Epi.ContentSite\Controllers\SearchController.cs:line 56
   at Trisept.Vax.Epi.ContentSite.Controllers.SearchController.Index(Nullable`1 p) in C:\TFS\Trisept.VAX.Content\Development\Trisept.Vax.Epi\Trisept.Vax.Epi.ContentSite\Controllers\SearchController.cs:line 40
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()

If I remove the Track() method, it works fine.

But I need to gather the statistics. Can't figure what I am doing wrong. Please help.

Thank you.

----- Update -----

The above issue occurs only when I am logged in via SAML authenticated user.

Both search and statistics work fine when the user is Epi admin

#188723 Edited, Mar 01, 2018 15:37
  • Johan Petersson
    Member since: 2007
     

    What happens if you move .Track() to just before .GetResult()?

    #188731 Mar 01, 2018 20:09
  • nalinb
    Member since: 2017
     

    Same issue happens, wherever I put the Track()

    #188734 Mar 01, 2018 20:37
  • Johan Petersson
    Member since: 2007
     

    Then I would try to remove .Skip(), then .Filter() and then .InField() but still keep .Track() to figure out which filter is causing the issue in .Track() and then report this as a bug to Episerver.

    Btw, is the pagination working correctly if you remove .Track()?

    #188735 Mar 01, 2018 20:42
  • nalinb
    Member since: 2017
     

    I removed all the .Filter(), .Skip() and .InField(), to change the code to the below statement. Still it throws the same exception.

    IEnumerable<UnifiedSearchHit> _SearchResults = searchClient.UnifiedSearch().For(queryString)
    .Track()
    .GetResult(hitSpec, false);

    Also, noticed that the issue is not reproducing when I am logged in with EPi Admin login, but it is reproducible when I login via an SAML Authentication account. (We have EPi accounts for Content Authors, but for end-users authentication is implemented via SAML)

    And, yes Pagination is working fine.

    #188811 Edited, Mar 05, 2018 7:20
  • Son Do
    Member since: 2012
     

    Hi Nalin,

    Can you try this simple query:

    var results = searchClient.UnifiedSearchFor(q)
                        .Filter(f => f.MatchType(typeof(FashionProduct)))
                        .Track()
                        .GetResult();

    Hope it work,

    For more information, refer to this document https://world.episerver.com/documentation/developer-guides/find/NET-Client-API/searching/Unified-search/

    /Son Do

    #188879 Edited, Mar 06, 2018 10:59
  • nalinb
    Member since: 2017
     

    Hi Son,

    Even this simple query failed. It is throwing the same exception as mentioned above.

    #188883 Mar 06, 2018 11:31
  • Son Do
    Member since: 2012
     

    Can you try to run reindex job then check again.

    #188886 Mar 06, 2018 12:10
  • nalinb
    Member since: 2017
     

    Tried it. No success. Still the same exception.

    #188890 Mar 06, 2018 12:58
  • Son Do
    Member since: 2012
     

    The site doesn't work with simple query, the reason might be your data.

    IMO you should create a support ticket. Support guys will call you and get your implementation, your databasse and your index for fixing the issue.

    /Son Do

    #188925 Mar 07, 2018 4:31
  • Dan Matthews
    Member since: 2006
     

    I had exactly this same issue, in the same bit of code, and found that it was actually because the Episerver code tries to allocate a unique ID for the tracking based on this logic (Find 13):

    1. If there's no current HTTP Context, use a hash of the MAC address (for example, if this is being called from a console app)
    2. If there's no user in the current HTTP Context, use a hash of the Session ID of the current HTTP Context (user not logged on)
    3. If there's a user in the current HTTP Context, use a hash of the current user's name in their identity

    Point (3) is where it was breaking for me... I was in a web content and authenticated using ASP.NET Identity but was using a custom JWT Token that wasn't adding the Name claim. This meant that HttpContext.Current.User.Identity.Name was null and so it was breaking when trying to hash it.

    To fix it, I just added the following line to the code where the JWT Token was being created (this project is generating it's own JWT Tokens in a custom oAuth provider):

      identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); // we do this to let Find work - it requires an identity name in order to track statistics

    It's almost certain that you've got the same problem - just make sure that the steps 1-3 above are all valid and the code should work!

    #195487 Jul 26, 2018 12:19
  • nalinb
    Member since: 2017
     

    Thank you Dan,

    Adding the Name claim worked like a charm.

    #195553 Jul 30, 2018 11:58
  •  

    The fix for FIND-3741 will solve this issue. The fix will also include null-check.

    #195967 Edited, Aug 14, 2018 13:59