-1

Web APIを理解する目的で、テストWeb APIコントローラを構築しようとしています。ASP.NET Web API CreatedAtRoute return 500 Internal Server Error

[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)方法は正常に動作:私は、次のWeb APIコントローラを書いています。コメント付きのポートメソッドも正常に動作します。他のpostメソッドでは、CreatedAtRouteメソッドを使用しようとしています。ポストマンツールを使用してこのアクションを呼び出すと、500 internal server errorが返されます。私はメソッドのパラメータのいくつかの選択肢を試しました(あなたがコメントのreturnステートメントで見ることができるように)が、それらのうちのどれもうまくいきませんでした。

のSystem.InvalidOperationException:Noルートが供給 値と一致しない

これは私が得る詳細なエラーです。 でMicrosoft.AspNetCore.Mvc.CreatedAtRouteResult.OnFormatting(するactionContext コンテキスト)

Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor.ExecuteAsync(するactionContext コンテキストたObjectResult結果)

で Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__32.MoveNext()

---例外がスローされた前の場所からのスタックトレースの終わり - - Microsoftの System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotificationで System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)

(タスク タスク)

。 AspNetCore.Mvc.Internal.ControllerActionInvoker.d__31.MoveNext()

---例外がスローされた前の場所からのスタックトレースの末尾--- システムでMicrosoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__29.MoveNext()

---例外がスローされた以前の位置からスタックトレースの終了時

---

。 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotificationでRuntime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)

(タスク タスク)

Microsoft.AspNetCoreで Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__23.MoveNext()

---例外がスローされた以前の位置からスタックトレースの終わり---

.Mvc.Internal.ControllerActionInvoker.d__18。MoveNextメソッド()

---例外がスローされた以前の位置からスタックトレースの終わり---

で System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)

で Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNextでSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)

()

---例外がスローされた以前の位置からスタックトレースの終わり---

System.Runtimeで System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)

で Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__6.MoveNext()

で.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)

は、すべてのヘルプは非常に問題が(abiapiする必要があります)あなたのHTTPのPOSTのreturn文でスペルミスのようです

+2

これはおそらく、 'api/books/1'ではなく' abi/books/1'のようにタイプミスです。したがって、 'abi'で始まるルートがないので、エラーは正確です。 – Nkosi

+0

あなたのスペルミスの問題は他の人にとっては非常に有用な質問ではありません。それを外したり閉じたりしてください。 –

+0

私はあなたの提案を述べるより良い方法があると信じています。とにかく、質問を削除できませんでした。回答を削除できない質問を削除しようとするとエラーが発生します – user2931442

答えて

1

を高く評価しています。それを修正する必要があります。また、HTTP GETメソッド(つまり、GetBook)のルート名を指定する方がよい場合もあります。そしてあなたのHTTP POST returnステートメントでは、ルート名とルート値とオブジェクトを渡します。また、あなたの本オブジェクトを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); 
} 
+0

'return Ok(book);'メソッドはGetアクションでも機能します。 'BadRequest();'がPOSTアクションでどのように使われたかのように。 – Nkosi

+0

お返事ありがとうございました。私のコードには誤字がありましたが(abiはapiにする必要があります)、これを修正しても問題は解決しなかったので、Getメソッドに問題を修正した名前を付けました。 – user2931442

関連する問題