Error 404 When trying to POST to plugin Controller action Before I dive into my problem, I do want to mention that I did do my due diligence and spent the last two days researching this problem, to no avail, so here it goes: 

So I'm getting the following error when trying to load an action method from the controller: Unable to resolve the request "ecaApi/main/doGeocodeRequest". I get this error if I try and navigate directly to it, e.g. domain.com/actions/ecaApi/main/doGeocodeRequest

The AJAX request below also generates a 404.

File Structure:

- craft/plugins
  - ecaapi
    - controllers
      --EcaApi_MainController.php
    --EcaApiPlugin.php


EcaApi_MainController.php

 namespace Craft;

    class EcaApi_MainController extends BaseController
    {
        protected $allowAnonymous = true;

        public function actionDoGeocodeRequest() {
            //.....
            $this-&gt;returnJson($result);
        }
    }


JS ajax call to the action method

    var data = {
        address: "{{ event.event_location }}"
    };
    data[csrfTokenName] = csrfTokenValue;
    data['action'] = 'ecaApi/main/doGeocodeRequest';
    $.ajax({
        method: "POST",
        url: "/",
        data: data
    })
        .done(function (data) {
            console.log(data);
            markers[{{ event.id }}] = new google.maps.Marker({
                position: new google.maps.LatLng(data.results[0].geometry.location.lat, data.results[0].geometry.location.lng),
                map: map,
                {% if mapSettings.mapIcon %}
                icon: mapMarkerIcon,
                {% endif %}
                title: "{{ event.title }}"
            });
            var content = '&lt;a href="{{ event.url|replace({'http://': 'https://'}) }}"&gt;{{ event.title }}&lt;/a&gt;';
            var window = new google.maps.InfoWindow({
                content: content
            });
            markers[{{ event.id }}].addListener('click', function () {
                window.open(map, markers[{{ event.id }}]);
            });

        });


Any help would be appreciated, I've been pulling out my hair for days over this.
Ok so thanks to @BradBell's suggestion, I regenerated the skeleton of my plugin and it's controller using pluginfactory.io and it now magically works! Still not sure exactly what the difference was, but it does its job now!