ASP.Net Web API中的多个Get方法

时间:2015-05-21 15:29:38

标签: asp.net-web-api

您好我有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/9api/{controller}/Name/10都在调用第一种方法GetData

有人可以指导我解决这个问题。

3 个答案:

答案 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扩展。如果您想要其他解释,请与我们联系。