【问题标题】:ASP.NET Web API CreatedAtRoute return 500 Internal Server ErrorASP.NET Web API CreatedAtRoute 返回 500 内部服务器错误
【发布时间】: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


【解决方案1】:

问题似乎是您的 HTTP POST 返回语句中的拼写错误(abi 应该是 api)。修复应该做到这一点。此外,为您的 HTTP GET 方法(即 GetBook)指定一个路由名称可能会更好。在您的 HTTP POST 返回语句中,传入路由名称以及路由值和对象。此外,您应该将 book 对象包装在 ObjectResult 中,然后再通过 HTTP GET 方法返回它。

// 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);
}

【讨论】:

  • return Ok(book); 方法在 Get 操作中同样有效。就像在 POST 操作中使用 return BadRequest(); 一样。
  • 非常感谢您的回答。我的代码中有一个错字(abi 应该是 api),但更正它并没有解决问题,它为 Get 方法提供了一个解决问题的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2017-08-26
相关资源
最近更新 更多