ไม่มีตัวอย่างข้างต้นที่เหมาะกับความต้องการส่วนตัวของฉัน ด้านล่างเป็นสิ่งที่ฉันทำ
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;
}
วิธีใช้ด้านบนในการใช้เส้นทางของคุณ:
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) });
สิ่งที่เกิดขึ้นคือชนิดข้อ จำกัด ของการปลอมในวิธีการเพื่อให้เส้นทางนี้ตรงกับวิธีการ GET, POST, PUT และ DELETE เริ่มต้นเท่านั้น "ความจริง" ที่มีบอกว่าเราต้องการตรวจสอบการจับคู่ของรายการในอาร์เรย์ หากเป็นเท็จคุณจะบอกว่าไม่รวมเส้นทางเหล่านั้นใน strYou สามารถใช้เส้นทางเหนือวิธีเริ่มต้นนี้เช่น:
config.Routes.MapHttpRoute("GetStatus", "{controller}/status/{status}", new { action = "GetStatus" });
ในด้านบนนั้นเป็นหลักมองหา URL => ต่อไปนี้http://www.domain.com/Account/Status/Active
หรืออะไรทำนองนั้น
เหนือสิ่งอื่นใดฉันไม่แน่ใจว่าฉันบ้าเกินไป ในตอนท้ายของวันที่ควรจะเป็นต่อทรัพยากร แต่ฉันเห็นความจำเป็นในการแมป URL ที่เป็นมิตรด้วยเหตุผลหลายประการ ฉันรู้สึกค่อนข้างมั่นใจว่า Web Api วิวัฒนาการจะมีบทบัญญัติบางอย่าง ถ้าเวลาฉันจะสร้างทางออกที่ถาวรและโพสต์