If you use MVC and follow Sitecore's guidelines with regards to which config files should be enabled/disabled on CD servers you might run into this exception:

InvalidOperationException: No route in the route table matches the supplied values.

The issue

This can happen when you have deleted/disabled the Sitecore.Speak.Mvc.config, which Sitecore recommends you do on Content Deliver servers, and use the default MVC helper methods @Html.Action and @Html.RenderAction in your renderings.

For some reason those methods requires a route containing the pattern {controller}/{action} to work. These are part of the default route in a standard MVC project, but usually not in a Sitecore project.

But then why does it work until we delete/disable Sitecore.Speak.Mvc.config?

Because that config files adds a processor to the initialize pipeline.

<initialize>
  <processor type="Sitecore.Mvc.Pipelines.Initialize.InitializeCommandRoute, Sitecore.Speak.Client" patch:before="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeRoutes, Sitecore.Mvc']"/>
</initialize>

This processor registers the following routes:

protected virtual void RegisterRoutes(RouteCollection routes, PipelineArgs args)
{
    string commandRoutePrefix = SpeakSettings.Mvc.CommandRoutePrefix;
    routes.MapRoute("Sitecore.Speak.Commands", commandRoutePrefix + "{controller}/{action}");
    routes.MapRoute("Sitecore.Speak", "sitecore/shell/api/sitecore/{controller}/{action}");
}

So when you delete/disable this config file, those routes do no longer get registered.

How to fix it

It's pretty simple to fix. You just have to add a route containing the {controller}/{action} pattern in your own processor in the initialize pipeline.

// Something like this
RouteTable.Routes.MapRoute(
    "Bogus-Required-Route",
    "bogus-required-route/{controller}/{action}",
);

I'm not sure if the route would overwrite Sitecore's route handling, so to be sure I would use a distinct path for the route that you are sure to never match a page URL for your site.

If you want to prevent the action method from being invoked as a result of a user request you can add the [ChildActionOnly] attribute to it.

The Config Enable-Disable spreadsheet

If for some reason, like me, you can never find the download link for the Config Enable-Disable spreadsheet, then you can find them on this page.