Как проложить маршрут между двумя разными методами действий с одинаковыми параметрами - PullRequest
0 голосов
/ 12 июня 2018

Я занимаюсь разработкой ASP.NET Web API 2 с маршрутизацией атрибутов.У меня есть класс контроллера и два метода действия:

[RoutePrefix("api/settings")]
    public class SettingsController : ApiController
    {
        [Route("{getVersion}")]
        public async Task<IHttpActionResult> GetDBVersion(string PlatformID)
        {
            try
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                SqlManager sqlManager = new SqlManager();
                DataTable dt = sqlManager.GetLocalDBVersion(PlatformID);

                List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                Dictionary<string, object> row;
                foreach (DataRow dr in dt.Rows)
                {
                    row = new Dictionary<string, object>();
                    foreach (DataColumn col in dt.Columns)
                    {
                        row.Add(col.ColumnName, dr[col]);
                    }
                    rows.Add(row);
                }
                return Ok(serializer.Serialize(rows));
            }
            catch (Exception ex)
            {
                return Content(HttpStatusCode.ExpectationFailed, ex.Message);
            }
        }
        [Route("getBookingSetting/{PlatformID:int}")]
        public async Task<IHttpActionResult> GetDBBookingSetting(int PlatformID)
        {
            try
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                SqlManager sqlManager = new SqlManager();
                DataTable dt = sqlManager.GetBookingSetting(PlatformID.ToString());

                List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                Dictionary<string, object> row;
                foreach (DataRow dr in dt.Rows)
                {
                    row = new Dictionary<string, object>();
                    foreach (DataColumn col in dt.Columns)
                    {
                        row.Add(col.ColumnName, dr[col]);
                    }
                    rows.Add(row);
                }
                return Ok(serializer.Serialize(rows));
            }
            catch (Exception ex)
            {
                return Content(HttpStatusCode.ExpectationFailed, ex.Message);
            }
        }

Я вызываю первый метод действия по URL:

/api/settings/getVersion?PlatformID=1

, а второй по:

/api/settings/getBookingSetting?PlatformID=1

однако в обоих случаях первый метод действия вызывается каждый раз.Как я могу маршрутизировать между такими случаями, когда имена методов отличаются, но параметры имеют одно и то же имя и тип (или разные типы)?

1 Ответ

0 голосов
/ 12 июня 2018

Ваши определения маршрута не соответствуют вашим URL-адресам:

[Route("{getVersion}")]

Это предполагает параметр маршрута "getVersion", поэтому даже URL-адреса, подобные /api/settings/1, будут совпадать.Вы должны переписать его так, чтобы он не был параметром:

[Route("getVersion")]
public async Task<IHttpActionResult> GetDBVersion([FromUri]string PlatformID)

Далее:

[Route("getBookingSetting/{PlatformID:int}")]

Это определение ожидает PlatformID как часть маршрута (то есть /api/settings/getBookingSetting/1), новы передаете его как строку запроса.

Вы должны изменить определение на это:

[Route("getBookingSetting")]
public async Task<IHttpActionResult> GetDBBookingSetting([FromUri]int PlatformID)
...