首页 文章

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

提问于
浏览
0

我正在尝试构建一个测试Web API控制器,仅仅是为了理解Web API . 我写了以下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);
    }
}

GetGet(id) 方法工作正常 . 注释的端口方法也可以正常工作 . 在另一个post方法中,我正在尝试使用 CreatedAtRoute 方法 . 当我使用邮差工具调用此操作时,它返回 500 internal server error . 我为方法参数尝试了几种替代方法(正如您在注释返回语句中看到的那样),但它们没有工作 .

这是我得到的详细错误:

System.InvalidOperationException:没有路由匹配提供的值 . 在Microsoft.AspNetCore.Mvc.CreatedAtRouteResult.OnFormatting(ActionContext中上下文)在Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor.ExecuteAsync(ActionContext中上下文,ObjectResult结果)在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__32.MoveNext() - - 从先前的位置堆栈跟踪其中的例外是在Microsoft.AspNetCore.Mvc抛出---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(工作任务)在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(工作任务)结束.Internal.ControllerActionInvoker.d__31.MoveNext()---抛出异常的前一个位置的堆栈跟踪结束---在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__29.MoveNext()---堆栈跟踪结束从抛出异常的先前位置---在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotificat的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__23.MoveNext()中的离子(任务任务)---从抛出异常的先前位置开始的堆栈跟踪结束---在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__18 .MoveNext()---从先前的位置堆栈跟踪其中的例外是在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(工作任务)在抛出---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(工作任务)结束Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices上的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__6.MoveNext()中的.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

任何帮助都非常感谢

1 回答

  • 3

    问题似乎是HTTP POST返回语句中的拼写错误( abi 应为 api ) . 修复应该这样做 . 此外,为HTTP GET方法(即GetBook)指定路由名称可能更好 . 在HTTP POST return语句中,传递路由名称以及路由值和对象 . 此外,在您使用HTTP GET方法返回之前,应将书对象包装在 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);
    }
    

相关问题