【问题标题】:Defining two get function in WebAPI在 WebAPI 中定义两个 get 函数
【发布时间】:2013-03-22 10:21:20
【问题描述】:

当我尝试在 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 操作并分别调用每个操作?

【问题讨论】:

  • 一个是 GET,另一个是 POST,不是 2 个 GET 的……你是不是贴错了代码?
  • 是的,我错误地粘贴了错误的代码。我已经编辑了问题。谢谢
  • 请发布路由配置。

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


【解决方案1】:

使用默认路由模板,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);
}

【讨论】:

  • 我已经添加了属性 ActionName 但它仍然无法正常工作它仍然抛出同样的异常
  • 它在执行 MapHttpRoute 吗?也许尝试删除除我们正在谈论的 2 之外的所有其他操作方法...
【解决方案2】:

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

【讨论】:

  • 但他没有得到“没有这样的功能”。最有可能的是,问题出在其他地方。您过早地发布了答案。
  • @DanielHilgarth 我按原样写了一个问题的答案 - 现在情况发生了变化,虽然我的答案现在不再完全正确,但它对问题的“第一版”有效:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
相关资源
最近更新 更多