Không có ví dụ trên làm việc cho nhu cầu cá nhân của tôi. Dưới đây là những gì tôi đã làm.
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;
}
Để sử dụng ở trên trong tuyến đường của bạn sử dụng:
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) });
Điều xảy ra là loại ràng buộc trong phương thức sao cho tuyến này sẽ chỉ khớp với các phương thức GET, POST, PUT và DELETE mặc định. "Đúng" ở đó nói rằng chúng tôi muốn kiểm tra sự trùng khớp của các mục trong mảng. Nếu đó là sai, bạn sẽ nói loại trừ những người trong strYou. Sau đó, bạn có thể sử dụng các tuyến đường trên phương thức mặc định này như:
config.Routes.MapHttpRoute("GetStatus", "{controller}/status/{status}", new { action = "GetStatus" });
Ở trên, về cơ bản, nó đang tìm kiếm URL sau => http://www.domain.com/Account/Status/Active
hoặc một cái gì đó tương tự.
Ngoài những điều trên tôi không chắc mình sẽ trở nên quá điên rồ. Vào cuối ngày, nó phải là trên mỗi tài nguyên. Nhưng tôi thấy cần phải lập bản đồ các url thân thiện vì nhiều lý do. Tôi cảm thấy khá chắc chắn khi Web Api phát triển sẽ có một số loại cung cấp. Nếu có thời gian tôi sẽ xây dựng một giải pháp lâu dài hơn và đăng bài.