A critical vulnerability was discovered in React Server Components (Next.js). Our systems remain protected but we advise to update packages to newest version. Learn More

dada
Jan 28, 2022
  6996
(3 votes)

Configure your own Search & Navigation timeouts

Changing the timeout for Search & Navigation requests is something that has been requested over and over in forums and support cases for quite some time.
The default request timeout is set to 100 seconds (HttpWebRequest.Timeout default) which could be problematic when requests takes longer than expected.

You might know that you can set the request timeout in configuration

This will be used for all types of Find requests and could pose a problem if you want to lower it to 10 secs but at the same time not affect requests that should be allowed to run longer e.g bulk requests.

Timeout is set in milliseconds.

CMS 11 and lower

<appSettings><add key="episerver:FindDefaultRequestTimeout" value="30000" />

CMS 12

   "AppSettings": {
        "episerver:FindDefaultRequestTimeout": 30000
    }

More on configuration here https://world.optimizely.com/documentation/developer-guides/CMS/configuration/

But it's also possible with some code to set the timeout for a specific request

Add the following extension methods

public static ITypeSearch<TResult> SetTimeout<TResult>(this ITypeSearch<TResult> search, int timeout)
{
    return new Search<TResult, IQuery>(search, context =>
    {
        var existingAction = context.CommandAction;
        context.CommandAction = command =>
        {
            if (existingAction.IsNotNull())
            {
                existingAction(command);
            }
            command.ExplicitRequestTimeout = timeout;
        };

    });
}

public static ISearch<TResult> SetTimeout<TResult>(this ISearch<TResult> search, int timeout)
{
    return new Search<TResult, IQuery>(search, context =>
    {
        var existingAction = context.CommandAction;
        context.CommandAction = command =>
        {
            if (existingAction.IsNotNull())
            {
                existingAction(command);
            }
            command.ExplicitRequestTimeout = timeout;
        };

    });
}

public static IMultiSearch<TResult> SetTimeout<TResult>(this IMultiSearch<TResult> multiSearch, int timeout)
{
    var searches = new List<ISearch<TResult>>(multiSearch.Searches);
    multiSearch.Searches.Clear();
    foreach (var search in searches)
    {
        multiSearch.Searches.Add(SetTimeout(search, timeout));
    }
    return multiSearch;
}

And use it like this

var results = SearchClient.Instance
  .UnifiedSearch
  .For("random fruit")
  .SetTimeout(10000)
  .GetResult();

var results = searchClient.Search<Fruits>
  .For("banana")
  .SetTimeout(1000)
  .GetResult();

var results = searchClient.MultiSearch<Fruits>()
  .Search<Exotic>(x => x.For("Kiwi").InField(y => y.SearchTitle()))
  .Search<Ordinary>(x => x.For("Apple").InField(y => y.SearchTitle()))
  .SetTimeout(1000)
  .GetResult();


Make sure you catch your timeouts. They will throw a ServiceException.
More on Find exceptions you should consider catching is available in Jonas Bergqvist's blog post Exceptions in find 

Jan 28, 2022

Comments

Matthew Boniface
Matthew Boniface Oct 6, 2023 05:35 AM

Thanks for this post, really need this on most projects. However, I found two things didn't work for me:

1) CMS 12 DefaultRequestTimeout I found needed to be configured as:

{
  "EPiServer": {
    "Find": {
      //developer index
      "ServiceUrl": "https://demo02.find.episerver.net/xxxAAAyyyZZZ/",
      "DefaultIndex": "me_xx202310",
      "DefaultRequestTimeout": 10000,
      "ReindexMySitesOnly": true
    },

2) The IMultiSearch extension methods seemed to have no effect - no matter what I tried I found that it just used the DefaultRequestTimeout.

dada
dada Jun 5, 2025 05:55 PM

This was improved in the product later and highlighted here

https://world.optimizely.com/blogs/manh-nguyen/dates/2024/8/configure-your-own-search--navigation-timeouts/

Please login to comment.
Latest blogs
CMS Audiences - check all usage

Sometimes you want to check if an Audience from your CMS (former Visitor Group) has been used by which page(and which version of that page) Then yo...

Tuan Anh Hoang | Dec 12, 2025

Data Imports in Optimizely: Part 2 - Query data efficiently

One of the more time consuming parts of an import is looking up data to update. Naively, it is possible to use the PageCriteriaQueryService to quer...

Matt FitzGerald-Chamberlain | Dec 11, 2025 |

Beginner's Guide for Optimizely Backend Developers

Developing with Optimizely (formerly Episerver) requires more than just technical know‑how. It’s about respecting the editor’s perspective, ensurin...

MilosR | Dec 10, 2025

Optimizely PaaS Administrator Certification : Free for Everyone

Optimizely has recently launched a free PaaS Administrator Certification. https://academy.optimizely.com/student/activity/2958208-paas-cms-administ...

Madhu | Dec 9, 2025 |