Yukarıdaki örneklerin hiçbiri kişisel ihtiyaçlarım için işe yaramadı. Aşağıdakileri yaptığım şey.
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;
}
Yukarıdakileri rotanızda kullanmak için şunu kullanın:
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) });
Olan şey, yöntemdeki kısıtlayıcı sahte türdür, böylece bu yol sadece varsayılan GET, POST, PUT ve DELETE yöntemleriyle eşleşir. Buradaki "doğru" dizideki öğelerin eşleşmesini kontrol etmek istediğimizi söylüyor. Yanlış olsaydı, str'de bulunanları hariç tut diyordunuz, sonra bu varsayılan yöntemin üzerindeki yolları kullanabilirsiniz:
config.Routes.MapHttpRoute("GetStatus", "{controller}/status/{status}", new { action = "GetStatus" });
Yukarıda, aslında aşağıdaki URL => http://www.domain.com/Account/Status/Activeveya bunun gibi bir şey arıyor .
Yukarıdakilerin ötesinde çok delireceğimden emin değilim. Günün sonunda kaynak başına olmalıdır. Ancak, çeşitli nedenlerden dolayı dost URL'leri haritalamaya ihtiyacım var. Web Api'nin bir tür hüküm olacak gibi geliştiğinden oldukça eminim. Eğer zaman kalırsa daha kalıcı bir çözüm ve görev yapacağım.