簡體   English   中英

一個WebApi控制器中有兩種發布方法,導致應用程序無法正常工作

[英]Two post methods in one WebApi controller, results in application not working

我有以下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並嘗試在學習過程中學習它,因此,如果有人可以啟發我了解為什么/我做錯了什么,我將非常感謝。

謝謝

您使用的路由模板是一個“輕松的”模板,將僅通過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將屬性直接添加到操作方法中。 對於非靜態樣式控制器而言,這通常更好。

在將內容類型設置為application/json ,應使用JSON.stringify(data)。

您可能已經將該值作為uri的一部分傳遞了,例如delete / 12或delete?ID = 12。

恕我直言,此外,您可以使用HttpDelete刪除動詞,而不是put或post,除非不接受delete。

HTH

在您的代碼中,只需刪除ajax方法上的contentType:“ application / json” 然后它將自動將您引導至控制器頁面。

請看下面的代碼

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

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

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

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM