0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

要求に一致する複数のアクションが見つかりましたの解決法(ASP.NET)

Posted at

背景

  • ASP.NETを用いて、APIの開発(勉強)をしていた。
  • 複数のアクションを定義して、勉強していたところ、あるアクションを実行しようとするとエラーが発生した。
  • 解決に時間を要してしまったため、記事に残しました。

実際のエラーコード

https://localhost:44325/api/helloworld/testaction?text=aaa

上記へアクセスした結果、想定していない結果が以下のように出力された。

{"Message":"エラーが発生しました。","ExceptionMessage":"要求に一致する複数のアクションが見つかりました: \r\n型 WebAPITest.Controllers.HelloWorldController の GetMessage2\r\n型 WebAPITest.Controllers.HelloWorldController の TestAction","ExceptionType":"System.InvalidOperationException","StackTrace":"   場所 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n   場所 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n   場所 System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"}

実際のコード

Imports System.Collections.ObjectModel
Imports System.Data.SqlClient
Imports System.Net
Imports System.Net.Http
Imports System.Web.Http

Namespace Controllers
    Public Class HelloWorldController
        Inherits ApiController

        <HttpGet>
        Public Function GetMessage() As String
            Return "Hello World"
        End Function
   
        <HttpGet>
        Public Function Add(ByVal a As Integer, ByVal b As Integer) As Integer
            Return a + b
        End Function

        <HttpGet>
        Public Function GetMessage2(ByVal text As String) As String
            Return "Hello Word " & text
        End Function

        <HttpGet>
        Public Function TestAction(ByVal text As String) As (Integer, String) #このアクションを実行しようとしている
            Dim number As Integer = 1
            Dim message As String = "bbb " & text
            Return (number, message)
        End Function
    End Class
End Namespace

解決した手順

原因:複数のアクションが実行されていた

なぜか、複数のアクションが同時に実行されたことで、エラーが発生しているようだった。

<HttpGet>

私はこれをアクションの手前に定義することで、自動でルーティングが行われるものと勘違いしていたようだった。適切なルートパターンを定義しておく必要があった。

対処法:ルーティングを明示

<Route("api/helloworld/アクション名")>

これをもとに、ルーティングを明示してやることで解決しました。

Imports System.Collections.ObjectModel
Imports System.Data.SqlClient
Imports System.Net
Imports System.Net.Http
Imports System.Web.Http

Namespace Controllers
    Public Class HelloWorldController
        Inherits ApiController

        <HttpGet>
        Public Function GetMessage() As String
            Return "Hello World"
        End Function
 
        <HttpGet>
        <Route("api/helloworld/Add")>
        Public Function Add(ByVal a As Integer, ByVal b As Integer) As Integer
            Return a + b
        End Function

        <HttpGet>
        <Route("api/helloworld/GetMessage2")>
        Public Function GetMessage2(ByVal text As String) As String
            Return "Hello Word " & text
        End Function

        <HttpGet>
        <Route("api/helloworld/TestAction")>
        Public Function TestAction(ByVal text As String) As (Integer, String)
            Dim number As Integer = 1
            Dim message As String = "bbb " & text
            Return (number, message)
        End Function
    End Class
End Namespace

実行結果

https://localhost:44325/api/helloworld/testaction?text=aaa

上記へアクセスした結果、想定した結果を出力することができた。

{"Item1":1,"Item2":"bbb aaa"}

注意事項

  • この記事では、visual studio 2022を使用しているので、試してみたい方は事前に準備が必要です。

この記事は誰向けの記事か?

  • 試しにASP.NETを始めてみたいと思っている人

環境

本記事における注意事項

  • 本記事は、備忘録としてまとめたものになります。
  • 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
  • また記載内容はすべて、正しい内容が記載されているとは限りません。
  • 誤った内容を見つけた場合は、ご指摘をお願いいたします。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?