处理多个GET操作Web API

时间:2016-07-07 06:50:01

标签: asp.net-mvc asp.net-web-api

我是WEB API的新手,并尝试为多个GET操作设置路由。

控制器代码

// Get api/values
public IEnumerable<tblUser> Get()
{
    //whatever 
}

// Get api/values/action
[ActionName("GetByQue")]
public IEnumerable<tblQue> GetQue()
{
    //whatever 
}

// Get api/values/action
[ActionName("GetUserScore")]
public IEnumerable<tblScore> GetScore(string user)
{
   //whatever 
}

配置

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional}
);

config.Routes.MapHttpRoute(
    name: "DefaultActionApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { action = "GetByQue" }
);

config.Routes.MapHttpRoute(
    name: "DefaultStringApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { action = "GetUserScore" }
);

当我尝试使用 http://localhost:54118/api/remote/GetByQue 网址时出现此错误

{
  "Message": "The request is invalid.",
  "MessageDetail": "The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'HydTechiesApi.Controllers.HydTechiesApiController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}

我的路由错了吗?任何帮助都是有价值的,因为我无法找到解决方案。

2 个答案:

答案 0 :(得分:1)

您应该在第二个配置中将{action}添加到routeTemplate而不是{id}

config.Routes.MapHttpRoute(
    name: "DefaultActionApi",
    routeTemplate: "api/{controller}/{action}",
    defaults: new { action = "GetByQue" }
);

你也可以尝试使用路线属于行动:

[ActionName("GetByQue")]
[Route("api/remote/GetByQue")]
public IEnumerable<tblQue> GetQue()
{
    //whatever 
}

或更改WebApiConfig.cs中配置的顺序(第二个配置和第一个配置)

答案 1 :(得分:0)

  1. 您在路线中犯了几个错误。如下面的示例代码:

      config.Routes.MapHttpRoute(
      name: "DefaultActionApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { action = "GetByQue" });
      //url:   http://localhost:54118/api/remote/GetByQue 
    
  2. (1)。 routeTemplate:“api / {controller} / {id}”。您指定的路线有ID,而且不是可选的。所以你的URL必须有id。这就是您的错误所显示的内容。您可以处理以下问题:

       defaults: new { id = RouteParameter.Optional }
    

    (2)。 默认值:new {action =“GetByQue”}); 您没有在 routeTemplate 中说出有关操作的任何内容。 默认关于操作,有任何意义。

    (3)。从您的路径,您的网址应该看起来像 http://localhost:54118/api/remote/5 ,您的路线不应该获得多种方法。

    1. 您可以使用一些解决方案:
    2. (1)。改变路线如下:

         config.Routes.MapHttpRoute(
          name: "DefaultActionApi",
          routeTemplate: "api/{controller}/{action}/{id}",
         defaults: new { id = RouteParameter.Optional }
         );
      

      请在每个方法中添加[HttpGet]。

           [HttpGet]
           public IEnumerable<tblUser> Get()
            {......}
      
           [HttpGet]
           [ActionName("GetByQue")]
           public IEnumerable<tblQue> GetQue()
           {......}
      
           [HttpGet]
           [ActionName("GetUserScore")]
             public IEnumerable<tblScore> GetScore(string user)
             {......}
      

      现在您可以使用 http://localhost:54118/api/remote/GetByQue

      等网址

      非常有用的提示:使用[Route(“”)]标签指定参数 **您还必须像上面一样更改路线(1)

      在Controller中

      ,请指定请求方法以确保get方法

          [HttpGet]
          [ActionName("GetUserScore")]
          [Route("api/remote/GetScore/{user}")]
           public IEnumerable<tblScore> GetScore(string user)
          {.....}
          //URL: http://localhost:54118/api/remote/GetScore/user