C# 如何调用控制器';在asp.net mvc中使用多个不同的名称创建的方法?

C# 如何调用控制器';在asp.net mvc中使用多个不同的名称创建的方法?,c#,asp.net-mvc,C#,Asp.net Mvc,我们应该编写一个提供客户信息的api,url应该是这样的 https://----.com/api/CustomerInfo/GetInfo?fromDate=1111&toDate=2222,..... https://----.com/api/CustomerInfo/98587445895?fromDate=1111&toDate=2222,..... public class PayaActionSelector : ApiControllerActionSelec

我们应该编写一个提供客户信息的
api
url
应该是这样的

https://----.com/api/CustomerInfo/GetInfo?fromDate=1111&toDate=2222,.....
 https://----.com/api/CustomerInfo/98587445895?fromDate=1111&toDate=2222,.....
public class PayaActionSelector : ApiControllerActionSelector
{
    public override HttpActionDescriptor SelectAction(HttpControllerContext context)
    {
        var actionMethod = context.ControllerDescriptor.ControllerType
         .GetMethods(BindingFlags.Instance | BindingFlags.Public).FirstOrDefault(x=>x.Name=="GetInfo");
        return new ReflectedHttpActionDescriptor(context.ControllerDescriptor, actionMethod);
    }
}
但是,客户机应该调用客户帐号,而不是
GetInfo
,如果它是有效帐号,则应该返回帐号信息,例如,客户机应该调用类似这样的东西

https://----.com/api/CustomerInfo/GetInfo?fromDate=1111&toDate=2222,.....
 https://----.com/api/CustomerInfo/98587445895?fromDate=1111&toDate=2222,.....
public class PayaActionSelector : ApiControllerActionSelector
{
    public override HttpActionDescriptor SelectAction(HttpControllerContext context)
    {
        var actionMethod = context.ControllerDescriptor.ControllerType
         .GetMethods(BindingFlags.Instance | BindingFlags.Public).FirstOrDefault(x=>x.Name=="GetInfo");
        return new ReflectedHttpActionDescriptor(context.ControllerDescriptor, actionMethod);
    }
}
其中
98587445895
为客户账户。

我应该如何让它以这种方式工作?

您应该按照C.M.和Hogan给出的建议隐藏动作名称

对于什么问题,您的帐号应该在哪里进行验证,这取决于您的系统架构。例如,如果要将route参数绑定到int,则第一级格式验证应由ASP.NET Web API绑定器执行。这是一个非常简单的验证,因为只有当帐号不是int或超过数据类型的限制时,验证才会失败。为了实现不依赖于数据类型格式的更健壮的验证,您可以使用服务层,在该服务层中进行检查,以确定该帐号是否有效,同时考虑到您的自定义规则


我希望我的回答会有帮助。如果你需要更多信息,请告诉我

您可以通过路由属性对其进行维护。类似于下面的语法

[Route("api/CustomerInfo/98587445895/{fromDate}/{toDate}")]

我终于发现了

我们需要将
操作选择器
约束
添加到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 AccountConstraint() });
      config.Services.Replace(typeof(IHttpActionSelector),
                               new PayaActionSelector());
    }
}
我们的动作选择器是这样的

https://----.com/api/CustomerInfo/GetInfo?fromDate=1111&toDate=2222,.....
 https://----.com/api/CustomerInfo/98587445895?fromDate=1111&toDate=2222,.....
public class PayaActionSelector : ApiControllerActionSelector
{
    public override HttpActionDescriptor SelectAction(HttpControllerContext context)
    {
        var actionMethod = context.ControllerDescriptor.ControllerType
         .GetMethods(BindingFlags.Instance | BindingFlags.Public).FirstOrDefault(x=>x.Name=="GetInfo");
        return new ReflectedHttpActionDescriptor(context.ControllerDescriptor, actionMethod);
    }
}
我们检查账户的地方就在这里

public class AccountConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var accList=Db.GetAccounts();
        object Account;
        values.TryGetValue("action", out Account);
        if (Account!=null && accList.Any(x=>x.AccNo==(string)Account))
        {                
            return true;
        }
        return false;
    }
}

这是一个糟糕的想法——除非这是一个内部网站,否则你会将机密信息泄露到所有地方。别担心,这是一个私人网络,而不是互联网。这样做有效吗:像这样的路由是核心的基础--@C.M.账号应该在哪里验证?