As stated in the SO answer, the real issue is that without enabling the **Sitecore.Speak.MVC.config**, there's no route pattern matching just `{controller}/{action}`.

The answer that will solve your problem is that you need to enable a config on the Content Delivery Servers that enable this route.

There are a couple ways you can do this:

### Option 1: Enable Sitecore.Speak.MVC.config

Let's take look at what this config is doing:

<!-- language: lang-xml -->

    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
      <sitecore>
        <pipelines>
          <initialize>
            <processor type="Sitecore.Mvc.Pipelines.Initialize.InitializeCommandRoute, Sitecore.Speak.Client" patch:before="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeRoutes, Sitecore.Mvc']"/>
          </initialize>
          <mvc.renderPlaceholder>
            <processor type="Sitecore.Mvc.Pipelines.Response.RenderPlaceholder.RenderAddedContent, Sitecore.Speak.Client"/>
          </mvc.renderPlaceholder>
        </pipelines>
        <mvc>
          <precompilation>
            <assemblies>
              <assemblyIdentity name="Sitecore.Speak.Web" />
            </assemblies>
          </precompilation>
        </mvc>
      </sitecore>
    </configuration>

This config is doing three things:

 - Initializing the Command Route (which is really the piece you need)
 - Adding a `<renderPlaceholder>` processor that renders added content.
 - Adds the Sitecore.Speak.Web assembly to the list of precompiled assemblies.

So, in a nutshell, there isn't much here that will harm a CD if this config is enabled, but the last two points aren't needed by the Content Delivery server.

### Option 2: Enable Command Route Manually
You can create a patch config that patches in the **InitializeCommandRoute**  processor above to the `<initialize>` pipeline.  If this patch config exists on the CM, where this processor is already defined, it won't conflict.

<!-- language: lang-xml -->

    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
      <sitecore>
        <pipelines>
          <initialize>
            <processor type="Sitecore.Mvc.Pipelines.Initialize.InitializeCommandRoute, Sitecore.Speak.Client" patch:before="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeRoutes, Sitecore.Mvc']"/>
          </initialize>
        </pipelines>
      </sitecore>
    </configuration>