您好我有2种不同的get
方法,签名如下,我的路由如下:
[ActionName("Data")]
public Dictionary<int, string> GetData(int ID)
{
}
[ActionName("Name")]
public Dictionary<int, string> GetName(int ID)
{
}
var route = routes.MapRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
但api/{controller}/Data/9
和api/{controller}/Name/10
都在调用第一种方法GetData
。
有人可以指导我解决这个问题。
答案 0 :(得分:0)
您必须使用[RoutePrefix(&#34; api / ControllerName&#34;)]装饰您的控制器类,并执行以下操作:
[Route("Data")]
public Dictionary<int, string> GetData(int ID)
{
}
[Route("Name")]
public Dictionary<int, string> GetName(int ID)
{
}
var route = routes.MapRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
答案 1 :(得分:0)
您可以使用Route
属性获得更多的幻想。
[Route("Name/{ThisIsMyIdVariableName}"), HttpGet]
public HttpResponseMessage GetName(int ThisIsMyIdVariableName) { /*code here*/ }
现在,您可以在不使用routes.MapRoute
的情况下保持一个漂亮网址的想法,并可以像domain.com/Name/19一样调用网址。您可以在路由中使用包含{}的多个变量名称,并在传递多个变量时保持您的URL非常安静。
如果您需要对api控制器进行版本化,这种方法也非常有用。
答案 2 :(得分:0)
我知道这应该是一个评论而不是一个答案,但我还没有发表评论所需的声誉,我想提供帮助。以上两种方法都是根据其id(PK)值返回数据吗?这两种方法在Web API服务器中调用第一种方法的原因是因为它们都将相同的URL扩展附加到服务器。区分这些方法的一种快速简便的方法是将2中的一个更改为接受一个可以转换回int的字符串。例如:
//api/Customer/5
public Dictionary<int, string> GetData(int ID)
{
}
//api/Customer?CustID={custID]
public Dictionary<int, string> GetName(string custID)
{
//convert string to int and continue code
}
这可能不是最佳做法,但这是我过去在我的web api服务器中需要区分GET / POST方法时所做的。对于反序列化,如果您正在使用Json等,则可以使用类似JsonConvert的类。然后,您对控制器的调用将添加我在方法上方留下的注释中定义的相应URL扩展。如果您想要其他解释,请与我们联系。