Keines der oben genannten Beispiele entsprach meinen persönlichen Bedürfnissen. Das Folgende ist, was ich letztendlich getan habe.
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;
}
Um das oben Genannte in Ihrer Route zu verwenden, verwenden Sie:
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) });
Was passiert, ist die Art von Fälschungen in der Methode, sodass diese Route nur mit den Standardmethoden GET, POST, PUT und DELETE übereinstimmt. Das "wahre" dort besagt, dass wir nach einer Übereinstimmung der Elemente im Array suchen möchten. Wenn es falsch wäre, würden Sie sagen, schließen Sie diejenigen in der strYou aus. Sie können dann Routen über dieser Standardmethode verwenden, wie:
config.Routes.MapHttpRoute("GetStatus", "{controller}/status/{status}", new { action = "GetStatus" });
Oben wird im Wesentlichen nach der folgenden URL gesucht => http://www.domain.com/Account/Status/Active
oder so ähnlich.
Darüber hinaus bin ich mir nicht sicher, ob ich zu verrückt werden würde. Am Ende des Tages sollte es pro Ressource sein. Ich sehe jedoch aus verschiedenen Gründen die Notwendigkeit, freundliche URLs zuzuordnen. Ich bin mir ziemlich sicher, dass es eine Art Bereitstellung geben wird, wenn sich Web Api weiterentwickelt. Wenn es Zeit ist, werde ich eine dauerhaftere Lösung erstellen und posten.