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.账号应该在哪里验证?