Web Api 发现多个操作方法

5
我有几个不同类型的参数需要作为操作。
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; }
}

路由在这里:

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

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

错误消息如下:

{"message":"发生了一个错误。","exceptionMessage":"找到多个匹配请求的操作:\r\nWebGUI.Controllers.MyController 上的 UpdateFeature\r\nWebGUI.Controllers.MyController 上的 DeleteFeature", "exceptionType":"System.InvalidOperationException","stackTrace":" …..


你使用了哪个URL,你的路由是什么样子的? - DavidG
2个回答

4

你的路由不正确,因为没有指定操作名称,所以它将 UpdateFeature 部分视为 ID 参数。请将其更改为:

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

我的路由是Web API模板的默认路由。但是你的解决方案可行。谢谢。 - barteloma

0
最好使用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 };
    }

}

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

config.MapHttpAttributeRoutes();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接