[英]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/UploadImage
和http://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.