在Web API中定义两个get函数

时间:2013-03-22 10:21:20

标签: c# routing asp.net-web-api

当我尝试在MVC WebAPI中调用GET函数时,我将遇到异常

 {"$id":"1","Message":"An error has occurred.",
 "ExceptionMessage":"Multiple actions were found that match the request: 
 \r\nSystem.Xml.XmlNode Get(Int32, System.String) 

我认为问题是由于两个get函数引起的 我已经定义了两个函数:

一:

   [HttpGet]
   public XmlNode Get(int id, string Tokken)
   {
        //Do something
   }

第二个

 [HttpGet]
 public List<UsersAnswers> GetUsersInteractions(int? activityID, string Tokken)
 {
  // Do Something
 }

路线配置

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

现在我在尝试调用第二个函数时遇到异常:

{SiteURL}/api/Activities/GetUsersInteractions?activityID=32&Tokken=r54e54353

正如您所看到的,路由引擎将请求发送到第一个函数而不是第二个函数。

如何定义两个get操作并分别调用每个操作?

2 个答案:

答案 0 :(得分:4)

使用默认路由模板,Web API使用HTTP方法选择操作。但是,您也可以创建一个路径,其中操作名称包含在URI中:

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

在此路由模板中,{action}参数为控制器上的操作方法命名。使用此样式的路由,使用属性指定允许的HTTP方法。例如,假设您的控制器具有以下方法:

public class ProductsController : ApiController
{
    [HttpGet]
    public string Details(int id);
}

在这种情况下,对“api / products / details / 1”的GET请求将映射到Details方法。这种路由类型与ASP.NET MVC类似,可能适用于RPC样式的API。

您可以使用ActionName属性覆盖操作名称。在以下示例中,有两个操作映射到“api / products / thumbnail / id。一个支持GET,另一个支持POST:

public class ProductsController : ApiController
{
    [HttpGet]
    [ActionName("Thumbnail")]
    public HttpResponseMessage GetThumbnailImage(int id);

    [HttpPost]
    [ActionName("Thumbnail")]
    public void AddThumbnailImage(int id);
}

答案 1 :(得分:1)

您没有调用第二个函数 - 第二个函数名为InsertUserRecord并且是POST方法。您通过GET致电的功能是GetUserInteractions。因为GET没有这样的函数,引擎可能会将它映射到唯一的GET函数,但实际上它应该抛出“没有这样的函数”错误。