几个动作发现 Web Api
Several actions found Web Api
我有 web api 2.0 项目
当我尝试使用相同参数实现多个方法时,出现此错误:找到多个操作
namespace WebApi.Controllers
{
public class EventController : ApiController
{
[HttpGet]
public HttpResponseMessage GetTags(string token, int messageId)
{
return ApiCall<List<EntityTag>>.CallApi(token, ServicesMessage.GetTags(messageId));
}
[HttpGet]
public HttpResponseMessage Get(string token, int eventId)
{
return ApiCall<EntityEvent>.CallApi(token, ServicesEvent.Get(eventId));
}
}
}
有什么想法吗?
谢谢
将这一行写在你的 webapiconfig.cs
config.Routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
您的控制器:
namespace WebApi.Controllers
{
public class EventController : ApiController
{
[HttpGet]
public HttpResponseMessage Tags(string token, int messageId)
{
return ApiCall<List<EntityTag>>.CallApi(token, ServicesMessage.GetTags(messageId));
}
[HttpGet]
public HttpResponseMessage Events(string token, int eventId)
{
return ApiCall<EntityEvent>.CallApi(token, ServicesEvent.Get(eventId));
}
}
}
使用它,您可以为每个获取请求指定操作名称。
POST
当你想用 post 方法做同样的事情时,只需在 weapiconfig.cs
的下面写下一行
config.Routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new { action = "Post" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });
然后你可以给一个动作名称。使用后无需路由
当您想调用 api 时,请编写如下:
api/Event/Tags //parameter as per your requirement
api/Event/Events //parameter as per your requirement
WebAPI 无法区分这两种方法,因为它们具有相同的参数类型和相同的 HttpVerb,并且使用隐式路由(它们没有路由属性)。
我非常喜欢控制器和方法的显式路由,而不是依赖于命名约定 - 所以我会尝试向方法添加路由属性:
public class EventController : ApiController
{
[HttpGet]
[Route("gettags")]
public HttpResponseMessage GetTags(string token, int messageId)
{
return ApiCall<List<EntityTag>>.CallApi(token, ServicesMessage.GetTags(messageId));
}
[HttpGet]
[Route("get")]
public HttpResponseMessage Get(string token, int eventId)
{
return ApiCall<EntityEvent>.CallApi(token, ServicesEvent.Get(eventId));
}
}
... 并在控制器本身上添加 RoutePrefix 属性,如下所示:
[RoutePrefix("/api/Event")]
public class EventController : ApiController
{
}
那么您应该能够通过对这些 URL 的 GET 请求来调用这些方法:
/api/event/get?token=xxxxx&eventId=xxxx
和
/api/event/gettags?token=xxxxx&messageId=xxxx
我有 web api 2.0 项目 当我尝试使用相同参数实现多个方法时,出现此错误:找到多个操作
namespace WebApi.Controllers
{
public class EventController : ApiController
{
[HttpGet]
public HttpResponseMessage GetTags(string token, int messageId)
{
return ApiCall<List<EntityTag>>.CallApi(token, ServicesMessage.GetTags(messageId));
}
[HttpGet]
public HttpResponseMessage Get(string token, int eventId)
{
return ApiCall<EntityEvent>.CallApi(token, ServicesEvent.Get(eventId));
}
}
}
有什么想法吗?
谢谢
将这一行写在你的 webapiconfig.cs
config.Routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
您的控制器:
namespace WebApi.Controllers
{
public class EventController : ApiController
{
[HttpGet]
public HttpResponseMessage Tags(string token, int messageId)
{
return ApiCall<List<EntityTag>>.CallApi(token, ServicesMessage.GetTags(messageId));
}
[HttpGet]
public HttpResponseMessage Events(string token, int eventId)
{
return ApiCall<EntityEvent>.CallApi(token, ServicesEvent.Get(eventId));
}
}
}
使用它,您可以为每个获取请求指定操作名称。
POST
当你想用 post 方法做同样的事情时,只需在 weapiconfig.cs
config.Routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new { action = "Post" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });
然后你可以给一个动作名称。使用后无需路由
当您想调用 api 时,请编写如下:
api/Event/Tags //parameter as per your requirement
api/Event/Events //parameter as per your requirement
WebAPI 无法区分这两种方法,因为它们具有相同的参数类型和相同的 HttpVerb,并且使用隐式路由(它们没有路由属性)。
我非常喜欢控制器和方法的显式路由,而不是依赖于命名约定 - 所以我会尝试向方法添加路由属性:
public class EventController : ApiController
{
[HttpGet]
[Route("gettags")]
public HttpResponseMessage GetTags(string token, int messageId)
{
return ApiCall<List<EntityTag>>.CallApi(token, ServicesMessage.GetTags(messageId));
}
[HttpGet]
[Route("get")]
public HttpResponseMessage Get(string token, int eventId)
{
return ApiCall<EntityEvent>.CallApi(token, ServicesEvent.Get(eventId));
}
}
... 并在控制器本身上添加 RoutePrefix 属性,如下所示:
[RoutePrefix("/api/Event")]
public class EventController : ApiController
{
}
那么您应该能够通过对这些 URL 的 GET 请求来调用这些方法:
/api/event/get?token=xxxxx&eventId=xxxx
和
/api/event/gettags?token=xxxxx&messageId=xxxx