Tidak satu pun dari contoh di atas yang berfungsi untuk kebutuhan pribadi saya. Di bawah ini adalah apa yang akhirnya saya lakukan.
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;
}
Untuk menggunakan hal di atas dalam penggunaan rute Anda:
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) });
Apa yang terjadi adalah kendala jenis palsu dalam metode sehingga rute ini hanya akan cocok dengan metode GET, POST, PUT dan DELETE standar. "True" di sana mengatakan kami ingin memeriksa kecocokan item dalam array. Jika itu salah Anda akan mengatakan mengecualikan orang-orang di strYou kemudian dapat menggunakan rute di atas metode default ini seperti:
config.Routes.MapHttpRoute("GetStatus", "{controller}/status/{status}", new { action = "GetStatus" });
Di atas pada dasarnya mencari URL berikut => http://www.domain.com/Account/Status/Active
atau sesuatu seperti itu.
Di luar di atas saya tidak yakin saya akan terlalu gila. Pada akhirnya itu harus per sumber daya. Tapi saya melihat perlunya memetakan url ramah karena berbagai alasan. Saya merasa cukup yakin karena Web Api berkembang akan ada semacam ketentuan. Jika waktu saya akan membangun solusi dan posting yang lebih permanen.