AngularJs和web api PUT无法正常工作

时间:2015-02-11 08:54:58

标签: asp.net angularjs asp.net-web-api

我想使用以下内容向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错误,包含以下标题:

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

我尝试了很多东西,但我仍然找不到问题。

整个控制器:

[授权] public class BookController: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)
{
}

1 个答案:

答案 0 :(得分:1)

有些东西让我觉得很奇怪,在.js你正在做以下事情:

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

这意味着这本书是一个“复杂”的对象,但在cs控制器部分,你会收到一本书作为字符串:

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

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

所以我的建议是创建一个类来匹配您从javascript发送的book参数。

ps:asp.net控制器上的Put()确实会出现与上述评论中建议相反的情况。