2

Controller

[Authorize]
public class EnumController : ApiController
{
    [HttpGet]
    public IEnumerable StatusVenda()
    {
        return Enum.GetValues(typeof(StatusVendaEnum)).Cast<object>()
             .Select(v => new
             {
                 Display = v.GetDisplayText(),
                 Id = v.ToString(),
                 Class = v.GetGroupText()
             }).ToList();
    }
}

Config

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // OData
        config.Routes.MapODataRoute(routeName: "OData", routePrefix: "odata", model: CreateModelBuider(config).GetEdmModel());
        config.EnableQuerySupport();

        // Need this because enum
        // Tips from http://stackoverflow.com/questions/11407267/multiple-httppost-method-in-mvc4-web-api-controller
        // Controller Only -> To handle routes like `/api/Usuarios`
        config.Routes.MapHttpRoute(
            name: "ControllerOnly",
            routeTemplate: "Api/{controller}"
        );

        // Controller with ID -> To handle routes like `/api/pessoas/1`
        config.Routes.MapHttpRoute(
            name: "ControllerAndId",
            routeTemplate: "Api/{controller}/{id}",
            defaults: null,
            constraints: new { id = @"^\d+$" } // Only integers 
        );

        // Controllers with Actions -> To handle routes like `/api/pessoas/getProfissoes`
        config.Routes.MapHttpRoute(
            name: "ControllerAndAction",
            routeTemplate: "Api/{controller}/{action}",
            defaults: new { action = "Get" }
        );

        config.Routes.MapHttpRoute(
            name: "ControllerActionAndId",
            routeTemplate: "Api/{controller}/{action}/{id}",
            defaults: null,
            constraints: new { id = @"^\d+$" } // Only integers 
        );

        #region Configurations

        var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        var enumConverter = new StringEnumConverter();
        jsonFormatter.SerializerSettings.Converters.Add(enumConverter);

        var jqueryFormatter = config.Formatters.FirstOrDefault(x => x.GetType() == typeof(JQueryMvcFormUrlEncodedFormatter));
        config.Formatters.Remove(config.Formatters.XmlFormatter);
        config.Formatters.Remove(config.Formatters.FormUrlEncodedFormatter);
        config.Formatters.Remove(jqueryFormatter);

        jsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;
        jsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        jsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
        jsonFormatter.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Include;

        config.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Include;

        #endregion
    }
}

GLobal.asax.cs

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine() { FileExtensions = new string[] { "cshtml" } });

AreaRegistration.RegisterAllAreas();

ValidatorOptions.ResourceProviderType = typeof(Resources.FluentValidation);

SecurityConfigurator.Configure(config =>
{
    config.DefaultPolicyViolationHandlerIs(() => new DefaultPolicyViolationHandler());
    config.GetAuthenticationStatusFrom(() => WebSecurity.IsAuthenticated);
    config.GetRolesFrom(() => Roles.GetRolesForUser());
    config.ForAllControllers().RequireAnyRole(RolesConst.Administrador);
    // Others config ommited

});

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
WebApiConfig.Register(GlobalConfiguration.Configuration);
BundleConfig.RegisterBundles(BundleTable.Bundles, Server);

ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder();

LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);

When I perform a request to /Api/Enum/StatusVenda a 404 error is returned!

ridermansb
  • 10,779
  • 24
  • 115
  • 226

1 Answers1

2

"Note for yourself, when you are registering odata route in web-api configuration, it must be placed before the default catch-all route"

Source: http://tech.trailmax.info/2014/02/odata-controllers-in-webapi-2-1-getting-404-page-not-found/

ridermansb
  • 10,779
  • 24
  • 115
  • 226