Web api中的路由应该是什么

时间:2019-02-20 09:36:17

标签: asp.net-mvc asp.net-web-api

我在Web API中有此方法

public class ProjectsController : ApiController
    {
        [HttpGet]
        public string GetProjects(string searchKeyword, int startRow, int endRow)
        {
            DataSet dsResult = ProjectsDB.GetProjects(searchKeyword, startRow, endRow);

            if (dsResult == null)
            {
                dsResult = new DataSet();
            }

            return JsonConvert.SerializeObject(dsResult, Formatting.Indented);
        }
    }

和路由配置为

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

调用函数是:

private async Task<List<Project>> GetProjects(ResultFilters model)
        {
            HttpResponseMessage httpResponse = null;
            string response = null;
            List<Project> lstProjects = new List<Project>();

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(GlobalConstants.WebAPIURL + "/api/Projects/GetProjects");
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                httpResponse = await client.PostAsJsonAsync(client.BaseAddress, model).ConfigureAwait(false);

                if (httpResponse.IsSuccessStatusCode)
                {
                    response = httpResponse.Content.ReadAsStringAsync().Result;
                    lstProjects = JsonConvert.DeserializeObject<List<Project>>(response);
                }                 
            }

            return lstProjects;
        }

ResultFilters对象具有API方法所需的参数值。

上面的代码未返回任何数据,我怀疑API未命中或可能是路由问题。我也没有运气去调试Web API。

  1. 我在这里做错什么了。
  2. 如果要更改路由配置,则每个控制器将有多种方法,每种方法可能具有不同的参数。

1 个答案:

答案 0 :(得分:1)

您有一个GET方法,并对它发出了POST。

我怀疑您希望它是POST,因此请更改API方法上的HTTP动词。

接下来,检查您的模型并确保其符合API方法的要求。

模型应如下所示:

public class ResultFilters {
   public string searchKeyword { get; set; }
   public int startRow { get; set; }
   public int endRow { get; set; }
}

您的API方法将如下所示:

[HttpPost]
        public string FilterProjects([FromBody] ResultFilters filters)
        {
            DataSet dsResult = ProjectsDB.GetProjects(filters.searchKeyword, filters.startRow, filters.endRow);

            if (dsResult == null)
            {
                dsResult = new DataSet();
            }

            return JsonConvert.SerializeObject(dsResult, Formatting.Indented);
        }

当然,您需要查看您的方法名称,没有任何 GetProjects 方法(即 POST )。我实际上在答案中将其重命名,因为我无法忍受 Get这是POST 谬论。

如果要将其更改为get,则可以使用FromURI属性,当然也可以相应地更改调用代码。