无法使用MVC5使用Controller和Action名称访问WebAPI

时间:2017-11-16 01:27:27

标签: c# asp.net-mvc asp.net-web-api asp.net-mvc-5

我有一个WebAPI,

 public class SystemHealtController : ApiController
    {
        [HttpGet]
        public IHttpActionResult UpdateUsageDetail(string cpuUsage, string memoryUsage, string diskUsage)
        {

              // Do Stuff

            return Ok();
        }

RouteConfig也有默认设置,

 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 = "Job", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

但是当我导航到API网址http://localhost:64384/API/SystemHealt/UpdateUsageDetail?cpuUsage=2&memoryUsage=4&diskUsage=76时,会出现以下错误:

  

HTTP 404.您要查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用。请查看以下网址,确保拼写正确。

我唯一怀疑的是,在创建Controller之前,我安装了

Microsoft.AspNet.WebApi 

然后卸载以及怀疑可能是问题。但卸载后也没有错误。

2 个答案:

答案 0 :(得分:2)

默认情况下,web api路由已在WebApiConfig类中注册 路线模式api/{controller}/{id}

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

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

您可以看到没有操作方法名称。这些方法由动词(POST或GET,您正在进行的调用类型)访问。因此,通常您将创建GET方法(以读取数据)和POST方法以将数据发布到(用于创建/更新数据)。当你想使用这些端点时,你将使用相同的url,但Http方法将是不同的(GET和POST)

所以你应该像

那样访问它
yourSiteBaseUrl/api/SystemHealt?cpuUsage=2&memoryUsage=4&diskUsage=76

这应该有效,假设您在应用中启用了Web api。如果您手动将web api功能添加到现有mvc项目,请按照this post中提到的步骤执行此操作。

默认情况下,RouteConfig中的路由注册用于MVC控制器。

答案 1 :(得分:0)

您是否尝试过添加路由前缀?

[RoutePrefix("api/SystemHealt")]
public class SystemHealtController : ApiController
{
    [HttpGet]
    public IHttpActionResult UpdateUsageDetail(string cpuUsage, string 
     memoryUsage, string diskUsage)
    {

          // Do Stuff

        return Ok();
    }
相关问题