C# ASP.NET Web API CreatedAtRoute返回500内部服务器错误

C# ASP.NET Web API CreatedAtRoute返回500内部服务器错误,c#,asp.net-core,asp.net-core-webapi,asp.net-core-routing,C#,Asp.net Core,Asp.net Core Webapi,Asp.net Core Routing,我试图构建一个测试WebAPI控制器,只是为了理解WebAPI。我编写了以下web API控制器: [Route("api/books")] public class BookController : Controller { public IEnumerable<Book> Get() { List<Book> books = new List<Models.Book>(); books.Add(new Bo

我试图构建一个测试WebAPI控制器,只是为了理解WebAPI。我编写了以下web API控制器:

[Route("api/books")]
public class BookController : Controller
{

    public IEnumerable<Book> Get()
    {
        List<Book> books = new List<Models.Book>();
        books.Add(new Book { Title = "Test Title 1", Author = "Test Author 1", ISBN = "Test ISBN 1" });
        books.Add(new Book { Title = "Test Title 2", Author = "Test Author 2", ISBN = "Test ISBN 2" });

        return books;
    }

    [HttpGet("{id}")]
    public Book Get(int id)
    {
        return new Book { Title = "Test Title 1", Author= "Test Author 1", ISBN="Test ISBN 1", PublishingDate = DateTime.Today.AddYears(-90).AddDays(-73) };
    }


    //[HttpPost]
    //public IActionResult Post([FromBody]Book book)
    //{
    //    string str = "Post request received";

    //    return new JsonResult(str);
    //}


    [HttpPost]
    public IActionResult Post([FromBody]Book book)
    {            
        //return CreatedAtRoute("abi/books", new { controller = "Book", id = 1  }, book);
        //return CreatedAtRoute("Get", new { controller = "Book", id = 1  }, book);
        //return CreatedAtRoute("Get", book);
        //return CreatedAtRoute("abi/books", book);
        return CreatedAtRoute("abi/books/1", book);
    }
}
[路线(“api/books”)]
公共类BookController:控制器
{
公共IEnumerable Get()
{
列表书籍=新列表();
添加(新书{Title=“Test Title 1”,Author=“Test Author 1”,ISBN=“Test ISBN 1”});
添加(新书{Title=“Test Title 2”,Author=“Test Author 2”,ISBN=“Test ISBN 2”});
还书;
}
[HttpGet(“{id}”)]
公共图书获取(int id)
{
归还新书{Title=“Test Title 1”,Author=“Test Author 1”,ISBN=“Test ISBN 1”,PublishingDate=DateTime.Today.AddYears(-90)。AddDays(-73)};
}
//[HttpPost]
//公共IActionResult Post([FromBody]Book)
//{
//string str=“收到请求后”;
//返回新的JsonResult(str);
//}
[HttpPost]
公共IActionResult Post([FromBody]Book)
{            
//返回CreatedAtRoute(“abi/books”,new{controller=“Book”,id=1},Book);
//返回CreatedAtRoute(“Get”,new{controller=“Book”,id=1},Book);
//返回CreatedAtRoute(“获取”,书本);
//返回CreatedAtRoute(“abi/books”,book);
返回CreatedAtRoute(“abi/books/1”,book);
}
}
Get
Get(id)
方法工作正常。注释端口方法也可以正常工作。在另一个post方法中,我尝试使用
CreatedAtRoute
方法。当我使用postman工具调用此操作时,它返回
500内部服务器错误
。我尝试了几种方法参数的替代方案(如您在commentreturn语句中所看到的),但没有一种有效

这是我得到的详细错误:

System.InvalidOperationException:没有与提供的路由匹配的路由 价值观

在 Microsoft.AspNetCore.Mvc.CreatedAtRouteResult.OnFormatting(ActionContext (上下文)

在 Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor.ExecuteAsync(ActionContext 上下文、对象结果)

在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d_u32.MoveNext()

---来自引发异常的上一个位置的堆栈结束跟踪---

在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 (任务)

在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 (任务)

在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d_u31.MoveNext()

---来自引发异常的上一个位置的堆栈结束跟踪---

在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d_u29.MoveNext()

---来自引发异常的上一个位置的堆栈结束跟踪---

在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 (任务)

在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 (任务)

在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d_u23.MoveNext()

---来自引发异常的上一个位置的堆栈结束跟踪---

在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d_u18.MoveNext()

---来自引发异常的上一个位置的堆栈结束跟踪---

在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 (任务)

在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 (任务)

在 Microsoft.AspNetCore.Builder.RouterMiddleware.d_u4.MoveNext()

---来自引发异常的上一个位置的堆栈结束跟踪---

在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 (任务)

在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 (任务)

在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d_u6.MoveNext()


非常感谢您的任何帮助

问题似乎是您的HTTP POST return语句拼写错误(
abi
应该是
api
)。修好它就行了。另外,最好为HTTP GET方法(即GetBook)指定一个路由名称。在HTTP POST return语句中,传入路由名称以及路由值和对象。另外,在HTTP GET方法中返回book对象之前,应该将其包装在
ObjectResult

// GET /api/books/{id}
[HttpGet("{id}", Name = "GetBook")]
public IActionResult Get(int id)
{
    var book = new Book { 
        Title = "Test Title 1", 
        Author = "Test Author 1", 
        ISBN="Test ISBN 1", 
        PublishingDate = DateTime.Today.AddYears(-90).AddDays(-73) 
    };
    return new ObjectResult(book);
}

// POST api/books
[HttpPost]
public IActionResult Post([FromBody] Book book)
{
    if (book == null)
    {
        return BadRequest();
    }

    // code to add book to database
    //_context.Books.Add(book);
    //_context.Books.SaveChanges();

    return CreatedAtRoute(
        routeName: "GetBook",
        routeValues: new { id = 1 },
        value: book);
}

问题似乎是HTTP POST return语句拼写错误(
abi
应该是
api
)。修好它就行了。另外,最好为HTTP GET方法(即GetBook)指定一个路由名称。在HTTP POST return语句中,传入路由名称以及路由值和对象。另外,在HTTP GET方法中返回book对象之前,应该将其包装在
ObjectResult

// GET /api/books/{id}
[HttpGet("{id}", Name = "GetBook")]
public IActionResult Get(int id)
{
    var book = new Book { 
        Title = "Test Title 1", 
        Author = "Test Author 1", 
        ISBN="Test ISBN 1", 
        PublishingDate = DateTime.Today.AddYears(-90).AddDays(-73) 
    };
    return new ObjectResult(book);
}

// POST api/books
[HttpPost]
public IActionResult Post([FromBody] Book book)
{
    if (book == null)
    {
        return BadRequest();
    }

    // code to add book to database
    //_context.Books.Add(book);
    //_context.Books.SaveChanges();

    return CreatedAtRoute(
        routeName: "GetBook",
        routeValues: new { id = 1 },
        value: book);
}

这很可能是输入错误,因为您使用的是
abi/books/1
,而不是
api/books/1
。因此,错误是准确的,因为没有以
abi
开头的路线,我相信有更好的方法来陈述您的建议。无论如何,我不能删除这个问题。当我尝试删除时出现了一个错误,指出有答案的问题不能删除。这很可能是一个打字错误,因为您使用的是
abi/books/1
,而不是
api/books/1
。因此,错误是准确的,因为没有以
abi
开头的路线,我相信有更好的方法来陈述您的建议。无论如何,我不能删除这个问题。当我尝试删除时出现一个错误,说明有答案的问题无法删除
返回Ok(book)方法也可以在Get操作中使用。就像如何
ret一样