c# - Multiple actions were found that match the request for get in controller - Stack Overflow

admin2025-05-01  1

I seem to be going around in circles and going into debug mode doesn't seem to help at all. Looking at the Controller and Model for Members, I can't see any duplicate signatures (code blocks below) and the ajax call (JQuery) looks find to me. If someone could point me in the right direction, would be greatly appreciated.

I can see that the call to the API is being made and that it returns as a Code 500 with the full error below.

I have also tried cleaning, rebuilding, hard clearing the cache, restarting the application pool and restarting the machine I am running this on. Mostly just to kill as many straws as possible.

The full error I am getting is

{
    "Message": "An error has occurred.",
    "ExceptionMessage": "Multiple actions were found that match the request: \r\nGet on type Portal.api.MembersController\r\nGet on type Portal.api.MembersController",
    "ExceptionType": "System.InvalidOperationException",
    "StackTrace": "   at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n   at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"
}

JQuery / Javascript call

function fetchMemberDetails(el) {
    var puid = $(el).val();
    var pattern = /^[a-z\'\-]+[0-9]{3}$/i;

    if (pattern.test(puid)) {
        $.ajax({
            type: 'GET',
            url: baseMembersURL + puid,
            dataType: "json",
            success: function (data) {
                $.map(JSON.parse(data), function (i, item) {
                    ('#spanNewName').text(item.Name);
                })
            }
        });
    }
}

Members Controller

using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Results;
using System.Web.Script.Serialization;

namespace Portal.api
{
    public class MembersController : ApiController
    {
        JavaScriptSerializer jss = new JavaScriptSerializer
        {
            MaxJsonLength = int.MaxValue
        };

        // GET api/<controller>
        public void Get()
        {
        }

        public JsonResult<string> Get(object id)
        {
            if (Central.GetSession("PermissionLevel", "PORTAL") == "" && Central.GetSession("PermissionLevel", "PORTAL").All(char.IsDigit) && int.Parse(Central.GetSession("PermissionLevel", "PORTAL")) >= 2)
            {
                List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                Dictionary<string, object> row;
                Models.TeamViewer.Member member = new Models.TeamViewer.Member(id);
                row = new Dictionary<string, object>
                {
                    //return objects
                };

                rows.Add(row);

                return Json(jss.Serialize(rows));
            }
            else
            {
                // Error handling if conditions not met
            }
        }

        // POST api/<controller>
        public void Post([FromBody] string value)
        {
        }

        // PUT api/<controller>/5
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/<controller>/5
        public JsonResult<string> Delete(int id, [FromBody] string value)
        {
            if (Central.GetSession("PermissionLevel", "PORTAL") != "" && Central.GetSession("PermissionLevel", "PORTAL").All(char.IsDigit) && int.Parse(Central.GetSession("PermissionLevel", "PORTAL")) >= 2)
            {
                List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                Dictionary<string, object> row;
                Models.TeamViewer.Member member = new Models.TeamViewer.Member(id);

                //Delete Member
            }

            return Json(jss.Serialize(value));
        }
    }
}

Members Model

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;

using Portal.Modules;

namespace Portal.Models.TeamViewer
{
    public class Member
    {
        private string sql;
        private DataTable dt = new DataTable();
        private readonly List<SqlParameter> sqlParams = new List<SqlParameter>();

        public int ID { get; set; }
        public string PUID { get; set; }
        public string Name { get; set; }
        public string Skills { get; set; }
        public List<Team> Teams { get; set; }

        public Member()
        {

        }

        public Member(object id)
        {
            if (id.GetType() == typeof(int))
            {
                ID = (int)id;
                FetchByID();
            }
            else if (id.GetType() == typeof(string))
            {
                PUID = (string)id;
                FetchByPUID();
            }
        }

        public Member(string puid, string name, string skills)
        {
            ID = 0;
            PUID = puid;
            Name = name;
            Skills = skills;
        }

        public void FetchByID()
        {
            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@ID", ID));
            sql = "SELECT PUID, Name, Skills, FkRank, LongRank, ShortRank " +
                "    FROM TeamPlanner_Members" +
                "   WHERE ID = @ID";
            dt = SQLDB.FetchMultipleValues(sql, Central.userDB, sqlParams);

            if (dt.Rows.Count > 0)
            {
                PUID = (string)dt.Rows[0]["PUID"];
                Name = (string)dt.Rows[0]["Name"];
                Skills = (string)dt.Rows[0]["Skills"];

                Teams = GetTeamList();
            }
        }

        public void FetchByPUID()
        {
            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@PUID", PUID));
            sql = "SELECT ID, Name, Skills " +
                "    FROM TeamPlanner_Members" +
                "   WHERE PUID = @PUID";
            dt = SQLDB.FetchMultipleValues(sql, Central.userDB, sqlParams);

            if (dt.Rows.Count > 0)
            {
                ID = (int)dt.Rows[0]["ID"];
                Name = (string)dt.Rows[0]["Name"];
                Skills = (string)dt.Rows[0]["Skills"];

                Teams = GetTeamList();
            }
        }

        public void Save()
        {
            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@PUID", PUID));
            sqlParams.Add(new SqlParameter("@Name", Name));
            sqlParams.Add(new SqlParameter("@Skills", Skills));

            if (ID != 0)
            {
                sql = "INSERT INTO TeamPlanner_Members(PUID, Name, Skills) " +
                    "             VALUES(@PUID, @Name, @Skills)";
                SQLDB.ExecuteSQL(sql, Central.userDB, sqlParams);
                SaveTeamList();
            }
            else
            {
                string ret;

                sqlParams.Add(new SqlParameter("@ID", ID));
                sql = "UPDATE TeamPlanner_Members " +
                    "     SET PUID = @PUID" +
                    "       , Name = @Name" +
                    "       , Skills = @Skills" +
                    "   WHERE ID = @ID";
                ret = SQLDB.ExecuteSQL(sql, Central.userDB, sqlParams);

                if (ret.All(char.IsNumber))
                {
                    ID = int.Parse(ret);
                    SaveTeamList();
                }
            }
        }

        private List<Team> GetTeamList()
        {
            List<Team> teamList = new List<Team>();

            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@Member", ID));
            sql = "SELECT FkTeam FROM TeamPlanner_Team_Member WHERE FkMember = @Member ORDER BY Ordering";
            dt = SQLDB.FetchMultipleValues(sql, Central.userDB, sqlParams);

            foreach (DataRow row in dt.Rows)
            {
                teamList.Add(new Team((int)row["FkTeam"]));
            }

            return teamList;
        }

        private void SaveTeamList()
        {
            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@Member", ID));
            sql = "DELETE FROM TeamPlanner_Team_Member WHERE FkMember = @Member";
            SQLDB.ExecuteSQL(sql, Central.userDB, sqlParams);

            foreach (Team team in Teams)
            {
                sqlParams.Clear();
                sqlParams.Add(new SqlParameter("@Member", ID));
                sqlParams.Add(new SqlParameter("@Team", team.ID));
                sql = "INSERT INTO TeamPlanner_Team_Members(FkMember, FkTeam) VALUES (@Member, @Team)";
                SQLDB.ExecuteSQL(sql, Central.userDB, sqlParams);
            }
        }

        public void AddToTeamList(int teamID)
        {
            Teams.Add(new Team(teamID));
        }

        public void RemoveFromTeamList(int teamID)
        {
            Teams.Remove(new Team(teamID));
        }

    }
}

Route Registration in Global

    routes.MapHttpRoute(
        name: "APIs",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

I seem to be going around in circles and going into debug mode doesn't seem to help at all. Looking at the Controller and Model for Members, I can't see any duplicate signatures (code blocks below) and the ajax call (JQuery) looks find to me. If someone could point me in the right direction, would be greatly appreciated.

I can see that the call to the API is being made and that it returns as a Code 500 with the full error below.

I have also tried cleaning, rebuilding, hard clearing the cache, restarting the application pool and restarting the machine I am running this on. Mostly just to kill as many straws as possible.

The full error I am getting is

{
    "Message": "An error has occurred.",
    "ExceptionMessage": "Multiple actions were found that match the request: \r\nGet on type Portal.api.MembersController\r\nGet on type Portal.api.MembersController",
    "ExceptionType": "System.InvalidOperationException",
    "StackTrace": "   at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n   at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"
}

JQuery / Javascript call

function fetchMemberDetails(el) {
    var puid = $(el).val();
    var pattern = /^[a-z\'\-]+[0-9]{3}$/i;

    if (pattern.test(puid)) {
        $.ajax({
            type: 'GET',
            url: baseMembersURL + puid,
            dataType: "json",
            success: function (data) {
                $.map(JSON.parse(data), function (i, item) {
                    ('#spanNewName').text(item.Name);
                })
            }
        });
    }
}

Members Controller

using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Results;
using System.Web.Script.Serialization;

namespace Portal.api
{
    public class MembersController : ApiController
    {
        JavaScriptSerializer jss = new JavaScriptSerializer
        {
            MaxJsonLength = int.MaxValue
        };

        // GET api/<controller>
        public void Get()
        {
        }

        public JsonResult<string> Get(object id)
        {
            if (Central.GetSession("PermissionLevel", "PORTAL") == "" && Central.GetSession("PermissionLevel", "PORTAL").All(char.IsDigit) && int.Parse(Central.GetSession("PermissionLevel", "PORTAL")) >= 2)
            {
                List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                Dictionary<string, object> row;
                Models.TeamViewer.Member member = new Models.TeamViewer.Member(id);
                row = new Dictionary<string, object>
                {
                    //return objects
                };

                rows.Add(row);

                return Json(jss.Serialize(rows));
            }
            else
            {
                // Error handling if conditions not met
            }
        }

        // POST api/<controller>
        public void Post([FromBody] string value)
        {
        }

        // PUT api/<controller>/5
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/<controller>/5
        public JsonResult<string> Delete(int id, [FromBody] string value)
        {
            if (Central.GetSession("PermissionLevel", "PORTAL") != "" && Central.GetSession("PermissionLevel", "PORTAL").All(char.IsDigit) && int.Parse(Central.GetSession("PermissionLevel", "PORTAL")) >= 2)
            {
                List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                Dictionary<string, object> row;
                Models.TeamViewer.Member member = new Models.TeamViewer.Member(id);

                //Delete Member
            }

            return Json(jss.Serialize(value));
        }
    }
}

Members Model

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;

using Portal.Modules;

namespace Portal.Models.TeamViewer
{
    public class Member
    {
        private string sql;
        private DataTable dt = new DataTable();
        private readonly List<SqlParameter> sqlParams = new List<SqlParameter>();

        public int ID { get; set; }
        public string PUID { get; set; }
        public string Name { get; set; }
        public string Skills { get; set; }
        public List<Team> Teams { get; set; }

        public Member()
        {

        }

        public Member(object id)
        {
            if (id.GetType() == typeof(int))
            {
                ID = (int)id;
                FetchByID();
            }
            else if (id.GetType() == typeof(string))
            {
                PUID = (string)id;
                FetchByPUID();
            }
        }

        public Member(string puid, string name, string skills)
        {
            ID = 0;
            PUID = puid;
            Name = name;
            Skills = skills;
        }

        public void FetchByID()
        {
            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@ID", ID));
            sql = "SELECT PUID, Name, Skills, FkRank, LongRank, ShortRank " +
                "    FROM TeamPlanner_Members" +
                "   WHERE ID = @ID";
            dt = SQLDB.FetchMultipleValues(sql, Central.userDB, sqlParams);

            if (dt.Rows.Count > 0)
            {
                PUID = (string)dt.Rows[0]["PUID"];
                Name = (string)dt.Rows[0]["Name"];
                Skills = (string)dt.Rows[0]["Skills"];

                Teams = GetTeamList();
            }
        }

        public void FetchByPUID()
        {
            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@PUID", PUID));
            sql = "SELECT ID, Name, Skills " +
                "    FROM TeamPlanner_Members" +
                "   WHERE PUID = @PUID";
            dt = SQLDB.FetchMultipleValues(sql, Central.userDB, sqlParams);

            if (dt.Rows.Count > 0)
            {
                ID = (int)dt.Rows[0]["ID"];
                Name = (string)dt.Rows[0]["Name"];
                Skills = (string)dt.Rows[0]["Skills"];

                Teams = GetTeamList();
            }
        }

        public void Save()
        {
            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@PUID", PUID));
            sqlParams.Add(new SqlParameter("@Name", Name));
            sqlParams.Add(new SqlParameter("@Skills", Skills));

            if (ID != 0)
            {
                sql = "INSERT INTO TeamPlanner_Members(PUID, Name, Skills) " +
                    "             VALUES(@PUID, @Name, @Skills)";
                SQLDB.ExecuteSQL(sql, Central.userDB, sqlParams);
                SaveTeamList();
            }
            else
            {
                string ret;

                sqlParams.Add(new SqlParameter("@ID", ID));
                sql = "UPDATE TeamPlanner_Members " +
                    "     SET PUID = @PUID" +
                    "       , Name = @Name" +
                    "       , Skills = @Skills" +
                    "   WHERE ID = @ID";
                ret = SQLDB.ExecuteSQL(sql, Central.userDB, sqlParams);

                if (ret.All(char.IsNumber))
                {
                    ID = int.Parse(ret);
                    SaveTeamList();
                }
            }
        }

        private List<Team> GetTeamList()
        {
            List<Team> teamList = new List<Team>();

            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@Member", ID));
            sql = "SELECT FkTeam FROM TeamPlanner_Team_Member WHERE FkMember = @Member ORDER BY Ordering";
            dt = SQLDB.FetchMultipleValues(sql, Central.userDB, sqlParams);

            foreach (DataRow row in dt.Rows)
            {
                teamList.Add(new Team((int)row["FkTeam"]));
            }

            return teamList;
        }

        private void SaveTeamList()
        {
            sqlParams.Clear();
            sqlParams.Add(new SqlParameter("@Member", ID));
            sql = "DELETE FROM TeamPlanner_Team_Member WHERE FkMember = @Member";
            SQLDB.ExecuteSQL(sql, Central.userDB, sqlParams);

            foreach (Team team in Teams)
            {
                sqlParams.Clear();
                sqlParams.Add(new SqlParameter("@Member", ID));
                sqlParams.Add(new SqlParameter("@Team", team.ID));
                sql = "INSERT INTO TeamPlanner_Team_Members(FkMember, FkTeam) VALUES (@Member, @Team)";
                SQLDB.ExecuteSQL(sql, Central.userDB, sqlParams);
            }
        }

        public void AddToTeamList(int teamID)
        {
            Teams.Add(new Team(teamID));
        }

        public void RemoveFromTeamList(int teamID)
        {
            Teams.Remove(new Team(teamID));
        }

    }
}

Route Registration in Global

    routes.MapHttpRoute(
        name: "APIs",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
Share Improve this question edited Jan 3 at 7:11 VLAZ 29.2k9 gold badges63 silver badges85 bronze badges asked Jan 2 at 15:32 P SP S 331 silver badge5 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 1

You have defined two Get methods, but didn't specified a different route for them.

So "Multiple actions were found that match the request for get in controller": means that asp.net isn't able to match any request/route to the methods (actions) specified.

I would use something like this:

public class MembersController : ApiController
{
    // GET api/members
    [HttpGet]
    [Route("")]
    public IHttpActionResult Get()
    {
        // Implementation for a generic Get request
        return Ok("Generic GET response");
    }

    // GET api/members/{id}
    [HttpGet]
    [Route("{id}")]
    public JsonResult<string> GetById(object id)
    {
        // insert your code here.....
    }
    
    // rest of the controller implementation
}   

Also, are you sure that the javascript code baseMembersURL + puid gives a valid url + querystring?

转载请注明原文地址:http://www.anycun.com/QandA/1746109727a91802.html