调用WebAPI GET导致404找不到

时间:2018-04-18 04:18:01

标签: c# api

VS 2017,New,Project,C#,ASP.NET Web应用程序,ASP.NET 4.5.2空模板。

未经检查的文件夹和Webforms,MVC和WebAPI的参考。后来通过Nuget添加了MS WebApi v5.4.2。

手动添加“Controllers”文件夹。

xController.cs:

namespace v1.MyApiCallTheirApi.api
{
    public class xController : ApiController
    {
        // GET api/<controller>
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }
}

的index.html:

<body>
    <input type="button" value="Go" onclick="go()"/>
    <script type="text/javascript">
        function go()
        {
            alert("lafdla");
            $.ajax({
                type: "GET",
                url: "/api/x", 
                success: alert("ok")
            });
        }
    </script>
</body>

$ .ajax call总是返回404.已经检查thisthat和其他许多人。到目前为止,我唯一的疑问是它可能需要一个Global.asax来进行路由配置,但我想在添加API后它应该为我自动添加一些隐藏的路由。

enter image description here enter image description here

3 个答案:

答案 0 :(得分:1)

目前您的应用程序并不知道如何创建路由。除非你提供关于每种代码所在位置的指针,否则MVC无法自动知道。

因此有两种方法(使用GlobalConfiguration实例): -

a)基于公约,使用地图路线方法。没有其他地方需要进一步改变。

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

b)使用控制器方法的属性来定义实际路线。然后在每个操作方法

上添加route属性
 config.MapHttpAttributeRoutes();

过度行动

[Route('api/myentity/get')
public entity GetEntity() { }

至于添加软件包,它只为您提供WebAPI所需的相关dll,不会进行任何更改

答案 1 :(得分:0)

您还可以通过操作属性[HttpGet("")]定义控制器的默认操作。

您需要更新您的操作:

// GET api/<controller>
[HttpGet("")]
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

提示Postman是测试api请求的一个不错的工具,.NET文档也推荐这个工具,请参阅here

答案 2 :(得分:0)

总结问题的原因和解决方案:

  1. Global.asax
  2. 通过App_Start进行API路由注册
  3. 属性和约定路线不能混合在一起
  4. 一旦进入属性,您必须为每个方法声明属性。
  5. 虽然Api控制器可以放在任何位置/文件夹中,并且可以在没有“Controller”后缀的情况下命名,但它必须具有类的“Controller”后缀,即public class v1Controller : ApiController,只有public class v1 : ApiController不会工作
  6. Global.asax是可选的,但它类似于项目的_init(),所以这是必须的,因为API需要路由。无论这个Api是由项目内部还是项目外调用,只要它触及内置的App_Start init项目的所有内容。

    public class Global : System.Web.HttpApplication
        {
            protected void Application_Start(object sender, EventArgs e)
            {
                GlobalConfiguration.Configure(WebApiConfig.Register);
            }
        }
    

    API路由注册通常在App_Start中定义,类名为WebApiConfig

    public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // Web API configuration and services
    
                // Either this Attribute Routing
                config.MapHttpAttributeRoutes();
    
                // Or this conventional Routing, but not together.
                config.Routes.MapHttpRoute(
                        name: "DefaultApi",
                        routeTemplate: "api/{controller}/{id}",
                        defaults: new { id = RouteParameter.Optional }
                    );
                }
            }
    
      

    从Nuget添加新包不会自动配置/添加必要的项目   投射。

    MS WebApi是基于MVC路由开发的,如果需要MVC则会很困惑,这里是一个很好的reading。答案是否,你不需要MVC来做WebApi。