Как поймать и принять конкретные имена действий в маршрутизации веб-API? - PullRequest
0 голосов
/ 17 мая 2019

Мы разрабатываем веб-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 '123456789'

1 Ответ

0 голосов
/ 17 мая 2019

Наконец я нашел себя ... для этой ситуации я должен пройти два шага, сначала наложить ограничение на действия в маршрутизации веб-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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...