我在angular和WebAPI中的PUT和DELETE请求中收到405(找不到方法)错误。 GET和POST工作正常。我已经检查了这类错误的所有解决方案' SO'但它没有奏效。我在 WebConfig 中添加了所需的处理程序(带有PUT / DELETE谓词),更新了IIS EXpress的 applicationhost.config ,并且还卸载了 WebDAV 模块但是问题仍然存在。
这是我的控制器代码:
[RoutePrefix("api/BlogPost")]
public class BlogPostController : ApiController
{
// GET: api/BlogPost
public IQueryable<BlogPostModel> GetblogPostTb()
{
return db.blogPostTb;
}
// GET: api/BlogPost/5
[ResponseType(typeof(BlogPostModel))]
public IHttpActionResult GetBlogPostModel(int id)
{
BlogPostModel blogPostModel = db.blogPostTb.Find(id);
if (blogPostModel == null)
{
return NotFound();
}
return Ok(blogPostModel);
}
// PUT: api/BlogPost/5
[ResponseType(typeof(void))]
public IHttpActionResult PutBlogPostModel(int id, BlogPostModel blogPostModel)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != blogPostModel.ID)
{
return BadRequest();
}
db.Entry(blogPostModel).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!BlogPostModelExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
[ResponseType(typeof(BlogPostModel))]
public IHttpActionResult DeleteBlogPostModel(int id)
{
BlogPostModel blogPostModel = db.blogPostTb.Find(id);
if (blogPostModel == null)
{
return NotFound();
}
db.blogPostTb.Remove(blogPostModel);
db.SaveChanges();
return Ok(blogPostModel);
}
}
这是客户端代码:
var updateBlogPost = function (id, blogPost) {
return $http.put(blogPostsUrl+"/"+id, blogPost)
.then(function (response) {
return response;
})
仅供参考,我正在使用Visual Studio Community 2015中的WebAPI2,IIS Express 10.我不确定这是IIS EXpress 10的错误还是VS的社区版。
答案 0 :(得分:2)
这似乎是使用WebAPI进行属性路由的已知问题。 这里用DELETE和PUT方法更新 AcceptVerbs 和 Route 属性,如下所示:
[ResponseType(typeof(void))]
[Route("{id:int}")]
[AcceptVerbs("PUT")]
public IHttpActionResult PutBlogPostModel(int id, BlogPostModel blogPostModel)
{
// Your code
}
并删除为:
[ResponseType(typeof(BlogPostModel))]
[Route("{id:int}")]
[AcceptVerbs("DELETE")]
public IHttpActionResult DeleteBlogPostModel(int id)
{
// Your Code
}
并且还为 GET 方法使用 AcceptVerbs 属性,因为这三个(GET,PUT,DELETE)具有相同的URL结构来调用它们的方法。