在WebAPI中定义两个get函数
当我试图在MVC WebAPI中调用GET函数时,我将遵循exception
{"$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 GetUsersInteractions(int? activityID, string Tokken) { // Do Something }
路线配置
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
现在我在尝试调用第二个函数时遇到exception:
{SiteURL}/api/Activities/GetUsersInteractions?activityID=32&Tokken=r54e54353
如您所见,路由引擎将请求发送到第一个函数而不是第二个函数。
如何定义两个get操作并分别调用每个操作?
使用默认路由模板,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); }
您没有调用第二个函数 – 第二个函数名为InsertUserRecord
,是一个POST
方法。 您通过GET
调用的函数是GetUserInteractions
。 因为GET
没有这样的function,所以引擎可以将它映射到唯一的GET
函数,但实际上它应该抛出“没有这样的函数”错误。