AngularJs 和网络 api PUT 不工作

AngularJs and web api PUT not working

我想使用以下内容向 Web api 服务器发出 PUT 请求。

Angular 资源和请求:

Books: $resource('/api/book/:id',
                {id: '@id'},
                {
                    'update' : {method: 'PUT'}
                })
...

$id = book.BookId
BookLibraryAPI.Books.update({id: $id},book);

Web API 控制器:

public void Put(int id, string book)
{

}

但是我得到 405 错误,如下 headers:

Request URL:http://localhost:53889/api/book/1009
Request Method:PUT
Status Code:405 Method Not Allowed
...

我试了很多东西,还是找不到问题。

以及整个控制器:

[授权] public class 图书控制器:ApiController { BusinessBundle _bundle = new BusinessBundle();

// GET api/book
public IEnumerable<Book> Get()
{
    return _bundle.BookLogic.GetAll();
}

// GET api/book/5
public Book Get(int id)
{
    return _bundle.BookLogic.GetBook(id);
}

// POST api/book
public void Post([FromBody]string value)
{

}

// PUT api/book/5
public void Put(int id, string book)
{
    var a = book; // just for testing
}

// DELETE api/values/5
public void Delete(int id)
{
}

让我感到奇怪的是,在 .js 中,您正在执行以下操作:

$id = book.BookId
BookLibraryAPI.Books.update({id: $id},book);

这意味着这本书是一个 'complex' 对象,但在 cs 控制器部分,您收到的是一个字符串形式的书:

// PUT api/book/5
public void Put(int id, string book)
{
    var a = book; // just for testing
}

首先,book 不能是字符串,因为您发送的是完整对象。在最坏的情况下,它可以是一个通用对象类型,最好的情况下它应该是一个 class, 与您从 angular 部分发送的成员完全相同

所以我的建议是制作一个 class 来匹配您从 javascript.

发送的 book 参数

ps:asp.net 控制器上的 Put() 确实期望第二个与上述评论中建议的相反。