一个 WebAPI 控制器中的两个 post 方法会导致应用程序无法正常工作

本文关键字:工作 应用程序 常工作 post 控制器 WebAPI 一个 两个 方法 | 更新日期: 2023-09-27 18:34:57

我有以下Web Api控制器

public class ImageUploadController : ApiController
{
    [HttpGet]
    public string UploadImage(int id)
    {
        return "Value = " + id;
    }
    [HttpPost]
    public void UploadImage([FromBody] Customer customer)
    {
        string name = customer.company_name;
        string dooda = string.Empty;
    }
    [HttpPost]
    public bool DeleteImage(int id)
    {
        try
        {
            string dooda = string.Empty;
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

上传图像的获取和发布方法有效,但一旦我添加另一个帖子,即删除图像,两个帖子都不起作用。

两种方法都收到 404 错误请求。

在我看来,我有两个按钮,一个调用上传图像,另一个调用删除图像,如下所示

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="jquery-1.11.2.js"></script>
<title></title>
</head>
<body>
<button id="btnPushMe">Push Me</button><br />
<button id="btnDeleteMe">Delete Me</button>
</body>
</html>
<script type="text/javascript">
$('#btnPushMe').click(function () {
    var apiurl = "http://localhost:50793/api/ImageUpload/UploadImage"
    var customer = { customer_name: "Scott", company_name: "HP" };
    $.ajax({
        type: "POST",
        data: JSON.stringify(customer),
        url: apiurl,
        contentType: "application/json"
    });
});
$('#btnDeleteMe').click(function () {
    var apiurl = "http://localhost:50793/api/ImageUpload/DeleteImage"
    $.ajax({
        type: "POST",
        data: { id: "2" },
        url: apiurl,
        contentType: "application/json"
    });
});
</script>

这是我的配置

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

同样,我只是在玩 Web Api 并尝试在我去的时候学习它,所以如果有人能启发我为什么/我做错了什么,我将不胜感激。

谢谢

一个 WebAPI 控制器中的两个 post 方法会导致应用程序无法正常工作

您使用的路由模板是一个"休息"模板,它将纯粹通过 HTTP 动词映射到控制器操作。 即模板中没有 {action}。

添加第二个发布方法时,WebAPI 无法消除调用的歧义。(例如,http://localhost:50793/api/ImageUpload/UploadImagehttp://localhost:50793/api/ImageUpload/DeleteImage 都匹配 api/{controller}/{id},这也匹配两种操作方法。该操作未在模板 URL 中指定。

使用 api/{controller}/{action}/{id} 这样的模板将映射您用来调用的 URL。请注意,这是远离一种宁静的方法;这不一定是错的。

您也可以考虑添加特定的模板 - 例如 api/ImageUpload/UploadImage 并在默认值中显式设置操作。

或者,您可以使用基于属性的路由,这将允许您使用所需的 url 将属性直接添加到操作方法中。这通常更适合非休息样式控制器。

您应该使用 JSON.stringify(data(,因为您将内容类型设置为 application/json

您可以将该值作为 uri 的一部分传递,例如 delete/12 或 delete?ID=12。

恕我直言,此外,您可以使用 HttpDelete 删除动词而不是放置或发布,除非不接受删除。

在您的代码中,只需删除 ajax 方法上的 contentType: "application/json"。然后它将自动将您引导至控制器页面。

请查看以下代码

$('#btnDeleteMe').click(function () {
var apiurl = "http://localhost:50793/api/ImageUpload/DeleteImage"
$.ajax({
    type: "POST",
    data: { id: "2" },
    url: apiurl,
});
相关文章: