Aucun des exemples ci-dessus n'a fonctionné pour mes besoins personnels. Voici ce que j'ai fini par faire.
public class ContainsConstraint : IHttpRouteConstraint
{
public string[] array { get; set; }
public bool match { get; set; }
/// <summary>
/// Check if param contains any of values listed in array.
/// </summary>
/// <param name="param">The param to test.</param>
/// <param name="array">The items to compare against.</param>
/// <param name="match">Whether we are matching or NOT matching.</param>
public ContainsConstraint(string[] array, bool match)
{
this.array = array;
this.match = match;
}
public bool Match(System.Net.Http.HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
if (values == null) // shouldn't ever hit this.
return true;
if (!values.ContainsKey(parameterName)) // make sure the parameter is there.
return true;
if (string.IsNullOrEmpty(values[parameterName].ToString())) // if the param key is empty in this case "action" add the method so it doesn't hit other methods like "GetStatus"
values[parameterName] = request.Method.ToString();
bool contains = array.Contains(values[parameterName]); // this is an extension but all we are doing here is check if string array contains value you can create exten like this or use LINQ or whatever u like.
if (contains == match) // checking if we want it to match or we don't want it to match
return true;
return false;
}
Pour utiliser ce qui précède dans votre itinéraire, utilisez:
config.Routes.MapHttpRoute("Default", "{controller}/{action}/{id}", new { action = RouteParameter.Optional, id = RouteParameter.Optional}, new { action = new ContainsConstraint( new string[] { "GET", "PUT", "DELETE", "POST" }, true) });
Ce qui se passe, c'est le genre de contrainte de faux dans la méthode afin que cette route ne corresponde qu'aux méthodes par défaut GET, POST, PUT et DELETE. Le "vrai" indique que nous voulons vérifier la correspondance des éléments du tableau. Si c'était faux, vous diriez exclure ceux dans la str Vous pouvez alors utiliser des routes au-dessus de cette méthode par défaut comme:
config.Routes.MapHttpRoute("GetStatus", "{controller}/status/{status}", new { action = "GetStatus" });
Dans ce qui précède, il recherche essentiellement l'URL suivante => http://www.domain.com/Account/Status/Active
ou quelque chose comme ça.
Au-delà de ce qui précède, je ne suis pas sûr de devenir trop fou. En fin de compte, cela devrait être par ressource. Mais je vois le besoin de mapper des URL conviviales pour diverses raisons. Je suis convaincu qu'au fur et à mesure de l'évolution de l'API Web, il y aura une sorte de disposition. Si le temps le permet, je construirai une solution plus permanente et publierai.