PUT/DELETE 在 VS Community 2015 中使用 angular 和 WebAPI 给出 ​​405 错误

PUT/DELETE giving 405 error with angular and WebAPI in VS Community 2015

我在 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 社区 2015 中使用 WebAPI2、IIS Express 10。我不确定这是 IIS EXpress 10 还是社区版 VS 的错误。

这似乎是 WebAPI 属性路由的已知问题。 此处使用 DELETE 和 PUT 方法更新 AcceptVerbsRoute 属性:

[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结构来调用他们的方法。