A complete example on how to implement a ASP.NET Web API Route Constraint.

// --------------------------------------------------------------------------
// Constraints/IdConstraint.cs
// --------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http;
using System.Web;
using System.Web.Http.Routing;

namespace MyApp.Constraints
{
    public class IdConstraint : IHttpRouteConstraint
    {
        public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
        {
            object value;

            if (!values.TryGetValue(parameterName, out value) || value == null)
            {
                return false;
            }

            try
            {
                return Convert.ToInt32(value) > 0;
            }
            catch
            {
                return false;
            }
        }
    }
}

// --------------------------------------------------------------------------
// Controller/CalendarController.cs
// --------------------------------------------------------------------------

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace MyApp.Controllers
{
    [RoutePrefix("api/tour")]
    public class CalendarController : ApiController
    {
        private AppDbContext _db = new AppDbContext();

        [Route("{id:identity}")]
        public Tour Get(int id)
        {
            var item = _db.Calendars
                .FirstOrDefault(i => i.CalendarId == id);

            return item;
        }
    }
}

// --------------------------------------------------------------------------
// App_Start/Startup.cs (Service Registration)
// --------------------------------------------------------------------------

using System;
using System.Web.Http;
using System.Web.Http.ExceptionHandling;
using System.Web.Http.Routing;
using MyApp.Config;
using MyApp.Constraints;
using MyApp.ExceptionHandlers;
using MyApp.Filters;
using MyApp.Loggers;
using Microsoft.Owin;
using Microsoft.Owin.Security;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Owin;

[assembly: OwinStartup(typeof(MyApp.Startup))]
namespace MyApp
{
    public class Startup
    {
        public static HttpConfiguration HttpConfiguration { get; set; } = new HttpConfiguration();

        public void Configuration(IAppBuilder app)
        {
            var config = Startup.HttpConfiguration;

            // var json = config.Formatters.JsonFormatter.SerializerSettings;
            // json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

            ConfigureWebApi(app, config);
        }

        private static void ConfigureWebApi(IAppBuilder app, HttpConfiguration config)
        {
            var constraintResolver = new DefaultInlineConstraintResolver();
            constraintResolver.ConstraintMap.Add("identity", typeof(IdConstraint));
            config.MapHttpAttributeRoutes(constraintResolver);

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            app.UseWebApi(config);
        }
    }
}