一个 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 并尝试在我去的时候学习它,所以如果有人能启发我为什么/我做错了什么,我将不胜感激。
谢谢
您使用的路由模板是一个"休息"模板,它将纯粹通过 HTTP 动词映射到控制器操作。 即模板中没有 {action}。
添加第二个发布方法时,WebAPI 无法消除调用的歧义。(例如,http://localhost:50793/api/ImageUpload/UploadImage
和 http://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,
});