2017-05-27 173 views
-1

我正在嘗試構建測試Web API控制器,僅用於瞭解Web API的目的。我寫了下面的Web API控制器:ASP.NET Web API CreatedAtRoute返回500內部服務器錯誤

[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()

---從以前位置拋出異常的堆棧跟蹤結束 - -

在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務 任務)

在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務 任務)

在 微軟。 AspNetCore.Mvc.Internal.ControllerActionInvoker.d__31.MoveNext()

---從以前的位置拋出異常的堆棧跟蹤結束---

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

---從先前的位置在那裏引發異常堆棧跟蹤的結尾---

在 系統。 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()

任何幫助,高度讚賞

+2

這很可能是一個錯字,因爲你有'abi/books/1'而不是'api/books/1'。因此錯誤是準確的,因爲存在與開始沒有路由'abi' – Nkosi

+0

你的拼寫錯誤的問題是不是爲別人一個非常有用的問題。嘗試刪除或關閉它。 –

+0

我相信有更好的方法來陳述你的建議。無論如何,我不能刪除這個問題。 '方法將在獲得工作的行動,以及;當我嘗試刪除,說明有正確答案的問題不能被刪除 – user2931442

回答

1

的問題似乎是在你的HTTP POST return語句一個拼寫錯誤(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); 
} 
+0

'返回OK(書)有一個錯誤。就像'返回BadRequest();'在POST操作中一樣。 – Nkosi

+0

非常感謝您的回答。有在我的代碼一個錯字(ABI應該是API),但糾正這並沒有解決問題,這是給Get方法即解決了這一問題的名稱。 – user2931442

相關問題