找到多个操作

本文关键字:操作 | 更新日期: 2023-09-27 18:05:46

我有不同类型参数的动作

public class MyController : ApiController
{       
    [HttpPost]
    public UpdateFeatureResponse UpdateFeature(UpdateFeatureResuest reqResuest)
    {
        return new UpdateFeatureResponse { IsSuccess = true };
    }
    [HttpPost]
    public DeleteFeatureResponse DeleteFeature(DeleteFeatureRequest request)
    {
        return new DeleteFeatureResponse{ IsSuccess = true };
    }
}

我的请求类型是这样的:

public class UpdateFeatureResuest
{
    public int Id { get; set; }
    public string Feature { get; set; }
}
public class UpdateFeatureResponse
{
    public bool IsSuccess { get; set; }
}
public class DeleteFeatureRequest
{
    public int Id { get; set; }
}
public class DeleteFeatureResponse
{
    public bool IsSuccess { get; set; }
}

Route is here:

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

当我发送请求(http://localhost:52285/api/My/UpdateFeature)通过fiddler它返回HTTP/1.1 500内部服务器错误

错误信息是:

{"message":"发生错误","exceptionMessage":"发现了多个与请求匹配的操作:'r'nUpdateFeature在类型WebGUI.Controllers上。MyController'r'nDeleteFeature on type WebGUI.Controllers.MyController","exceptionType":"System. controller . "InvalidOperationException"、"加":"……

找到多个操作

你的路由是错误的,因为它没有指定动作名称,所以它把UpdateFeature部分作为ID参数。改成这样:

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

最好使用Route属性

例如

[RoutePrefix("myapi")]
public class MyController : ApiController
{       
    [Route("update")]
    [HttpPost]
    public UpdateFeatureResponse UpdateFeature(UpdateFeatureResuest reqResuest)
    {
        return new UpdateFeatureResponse { IsSuccess = true };
    }
    [Route("delete")]
    [HttpPost]
    public DeleteFeatureResponse DeleteFeature(DeleteFeatureRequest request)
    {
        return new DeleteFeatureResponse{ IsSuccess = true };
    }
}

现在将此添加到config.Routes.MapHttpRoute()之前的WebApiConfig

config.MapHttpAttributeRoutes();