我有以下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并尝试学习它,如果有人可以告诉我为什么/我做错了我会非常感激。
由于
答案 0 :(得分:1)
您正在使用的路由模板是一个“restful”路由模板,它将完全由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直接向操作方法添加属性。对于非宁静风格的控制器来说,这通常更好。
答案 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,
});