【发布时间】:2017-10-28 06:45:58
【问题描述】:
我正在尝试构建一个测试 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);
}
}
Get 和 Get(id) 方法工作正常。注释端口方法也可以正常工作。在另一种发布方法中,我正在尝试使用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()
--- 从先前抛出异常的位置结束堆栈跟踪---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__31.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪---
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__29.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__23.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪---
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__18.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)
在 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)
在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__6.MoveNext()
非常感谢任何帮助
【问题讨论】:
-
这很可能是一个错字,因为您使用的是
abi/books/1而不是api/books/1。所以错误是准确的,因为没有以abi开头的路由 -
我相信有更好的方式来表达你的建议。无论如何,我无法删除问题。尝试删除时出错,提示无法删除有答案的问题
标签: c# asp.net-core asp.net-core-webapi asp.net-core-routing