위의 예 중 어느 것도 나의 개인적인 요구에 효과가 없었습니다. 아래는 내가 한 일입니다.
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 메소드와 만 일치하도록 메소드에서 제한 유형의 가짜가 발생합니다. "true"는 배열의 항목이 일치하는지 확인하고 싶다고 말합니다. 그것이 거짓이라면 str에서 경로를 제외한다고 말하고 다음과 같이이 기본 방법 위의 경로를 사용할 수 있습니다.
config.Routes.MapHttpRoute("GetStatus", "{controller}/status/{status}", new { action = "GetStatus" });
위의 내용은 본질적으로 다음 URL => http://www.domain.com/Account/Status/Active
또는 이와 유사한 것을 찾습니다 .
위를 넘어서서 너무 미쳤을 지 모르겠다. 하루가 끝나면 리소스마다 있어야합니다. 그러나 여러 가지 이유로 친숙한 URL을 매핑해야 할 필요가 있습니다. Web Api가 진화함에 따라 일종의 프로비저닝이있을 것이라고 확신합니다. 시간이 지나면 더 영구적 인 솔루션을 구축하고 게시하겠습니다.