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

时间:2014-12-22 01:18:54

标签: c# asp.net-mvc-4 asp.net-web-api

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

UploadImage的get和post方法有效,但只要我添加另一个帖子,即DeleteImage,这些帖子都不起作用。

我得到两种方法的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并尝试学习它,如果有人可以告诉我为什么/我做错了我会非常感激。

由于

3 个答案:

答案 0 :(得分:1)

您正在使用的路由模板是一个“restful”路由模板,它将完全由HTTP谓词映射到控制器操作。即模板中没有{action}。

当您添加第二个帖子方法时,WebAPI无法消除调用的歧义。(例如http://localhost:50793/api/ImageUpload/UploadImagehttp://localhost:50793/api/ImageUpload/DeleteImage都匹配api / {controller} / {id},它们也匹配两个操作方法。未在模板网址中指定。

使用api / {controller} / {action} / {id}这样的模板会映射您正在呼叫的网址。请注意,这是一种宁静的方法;这不一定是错的。

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

或者您可以使用基于属性的路由,这可以让您使用所需的URL直接向操作方法添加属性。对于非宁静风格的控制器来说,这通常更好。

答案 1 :(得分:0)

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

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

恕我直言,此外,你可以使用HttpDelete删除动词而不是put或post,除非不接受删除。

HTH

答案 2 :(得分:0)

在您的代码中,请删除ajax方法上的 contentType:&#34; application / json&#34; 。然后它会自动引导你进入控制器页面。

请查看以下代码

$('#btnDeleteMe').click(function () {

var apiurl = "http://localhost:50793/api/ImageUpload/DeleteImage"

$.ajax({
    type: "POST",
    data: { id: "2" },
    url: apiurl,

});