找到了几个操作Web Api

时间:2018-07-20 10:00:03

标签: c# webapi2

我有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));
        }
    }
}

有什么主意吗?

谢谢

2 个答案:

答案 0 :(得分:1)

WebAPI无法区分这两种方法,因为它们具有相同的参数类型和相同的HttpVerb,并且使用隐式路由(它们上没有路由属性)。

我是控制器和方法的显式路由的忠实拥护者,而不是依赖于命名约定-因此,我将尝试向这些方法添加route属性:

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

答案 1 :(得分:0)

将此行写在您的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));
        }
    }
}

使用此方法,您可以为每个get请求指定操作名称。

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