Как поймать и принять конкретные имена действий в маршрутизации веб-API?

Мы разрабатываем веб-API, и мы хотим перехватить все запросы к нашему API, получить имя действия и проверить, доступен ли он в нашей базе данных, и если да, то единственный метод перехватит его.
На самом деле имя метода должно быть банковским счетом клиента! я знаю, что это кажется странным, но нас попросили сделать это таким образом, скажем, у нас есть ниже адрес запроса

www.webSiteAddress.com/api/paya/123456789?amount=25&span=4587

123456789 - это банковский счет нашего клиента, который должен выступать в качестве имени действия! но сначала мы должны проверить это из базы данных, я нашел решение ниже, но оно не сработало.

public class IBanRoutingConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        object IBan;
        values.TryGetValue("action", out IBan);
        if (IBan!=null && db.Accounts.Any(x=>x.AccountNo==IBan))
        {                
            return true;
        }
        return false;
    }
}

и я использовал это как ограничение на маршрутизацию веб-API.

public static void Register(HttpConfiguration config)
{
  config.MapHttpAttributeRoutes();

  config.Routes.MapHttpRoute(
  name: "PayaApi",
  routeTemplate: "api/{controller}/{action}",
  defaults: new { id = RouteParameter.Optional },
  constraints: new { action = new IBanRoutingConstraint() });
}

но я закончил с этим сообщением ...

No action was found on the controller 'Paya' that matches the name �'

Всего 1 ответ


Наконец я нашел себя ... для этой ситуации я должен пройти два шага, сначала наложить ограничение на действия в маршрутизации веб-API, как показано ниже

public class IBanRoutingConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        object IBan;
        values.TryGetValue("action", out IBan);
        if (IBan!=null && db.Accounts.Any(x=>x.AccountNo==IBan))
        {                
            return true;
        }
        return false;
    }
}

затем мне нужно сообщить селектору действий API, как действовать при выборе метода действия во время процесса выбора действия.

public class PayaActionSelector : ApiControllerActionSelector
{
    public override HttpActionDescriptor SelectAction(HttpControllerContext context)
    {
        var actionMethod = context.ControllerDescriptor.ControllerType
         .GetMethods(BindingFlags.Instance | BindingFlags.Public).FirstOrDefault(x=>x.Name=="Index");
        return new ReflectedHttpActionDescriptor(context.ControllerDescriptor, actionMethod);
    }
}

и конфиг маршрутизации API будет выглядеть так

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
      config.MapHttpAttributeRoutes();

      config.Routes.MapHttpRoute(
      name: "PayaApi",
      routeTemplate: "api/{controller}/{action}/{id}",
      defaults: new { id = RouteParameter.Optional },
      constraints: new { action = new IBanRoutingConstraint() });
      config.Services.Replace(typeof(IHttpActionSelector),
                               new PayaActionSelector());
    }
}

Есть идеи?

10000