在ajax发布后检索数据时使用Http 404(使用web api)

时间:2015-01-07 23:27:04

标签: c# jquery asp.net http web

我开始使用asp.net,ajax / jquery和web api。

我写了一个非常基本的网络应用程序,只是为了了解发生了什么:

这里的模型:

public class Author
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
}

这里是控制器:

public class AuthorsController : ApiController
{
    List<Author> authors = new List<Author> 
    {
        new Author {Id=1, Name="Alan", Surname="Timo" },
        new Author {Id=2, Name="Jack", Surname="Russel"}
    };


    [HttpGet]
    public IHttpActionResult GetAuthor(int id)
    {
        Author autore = authors.FirstOrDefault(p => p.Id == id);

        if (autore == null)
            return NotFound();
        else
            return Ok(autore);
    }

    [HttpPost]
    public Author PostAutore([FromBody] Author author)
    {          
        authors.Add(author);

        foreach (Author aut in authors)
        {
            Debug.WriteLine(aut.Id + " " + aut.Name + " " + aut.Surname);
        }

        return author;
    }
}

这里是jquery中的get函数和post函数:

function GetAuthorById() {
        var id = $('#authorID').val();
        $.getJSON('api/authors/' + id).done(function (data) {
            alert(data.Name + data.Surname);
        });
    }


    function PostAuthor() {
        var author = {
            Id: $('#newAuthorId').val(),
            Name: $('#newAuthorName').val(),
            Surname: $('#newAuthorSurname').val()
        };

        $.post(
            'api/authors',
            author,
            function (data) {
                alert(data.Name + data.Surname);
            }
        );
    }

我的问题是关于在成功发布POST后使用GET。让我们说我已经触发了post方法,并且控制器成功添加了一个新的作者,如{&#34; Id&#34;:&#34; 3&#34;,&#34; Name&#34;:& #34; Tom&#34;,&#34; Surname&#34;:&#34; Cruise&#34;}到作者列表(我正在检查这个记录在Post的列表中每个作者的控制台详细信息控制器的方法)。现在,如果我尝试GET,例如&#39; api / authors / 3&#39;我得到了一个HTTP 404,而与Uri&#39; api / authors / 1&#39;或者&#39; api / authors / 2&#39;提供HTTP 200.任何人都可以解释一下为什么服务器在尝试检索成功POST时添加的数据时会给我404?

1 个答案:

答案 0 :(得分:3)

为每个请求实例化一个控制器。

您需要确保所有控制器实例共享相同的authors实例,方法是authors字段static

static List<Author> authors = new List<Author> 
{
    new Author {Id=1, Name="Alan", Surname="Timo" },
    new Author {Id=2, Name="Jack", Surname="Russel"}
};