ASP.NET Web API无论如何都会提供404

时间:2015-07-04 09:30:47

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

我制作了一个MVC 5项目并创建了一个MVC应用程序。现在我不想拥有某些方法的API,并决定创建一个常规的Web API控制器。我查看路线,它们看起来像这个默认值:

    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

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

    }

通过这个我的意思是,如果我去我的localhost并说localhost / api / events 然后我会得到结果。

我有控制器:

    [HttpGet]
    public IEnumerable<Event> GetAllEvents()
    {
        IEnumerable<Event> events = db.Events.ToList();
        return events;
    }

我还没有做过创造这些事情的其他事情。 无论我打电话怎么办:

http://localhost:29869/api/events

然后我得到404就好像那条路上什么都没有。 在这一刻,我只是为了让它发挥作用。

我的Global.asax看起来像这样:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        Database.SetInitializer<ApplicationDbContext>(null);
        GlobalConfiguration.Configure(WebApiConfig.Register);

    }

更改Global.asax后,我收到此消息:

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>
ved System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() ved System.Web.Http.Routing.RouteCollectionRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) ved System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase httpContext)
</StackTrace>
</Error>

2 个答案:

答案 0 :(得分:0)

将您的操作更改为

[HttpGet]
public IEnumerable<Event> Get()
{
    IEnumerable<Event> events = db.Events.ToList();
    return events;
}

这应该可行,您也可以使用属性路由添加您想要执行操作的特定路线I.e。

[HttpGet]
[Route("/Events")]
public IEnumerable<Event> GetAllEvents()
{
    IEnumerable<Event> events = db.Events.ToList();
    return events;
}

控制器的名称是什么,默认路由会找到控制器,然后选择与http动词(get)和任何参数匹配的动作,在你的情况下没有参数,所以localhost:29869 / api / Events会调用从EventsController获取前缀方法。路由属性将允许您指定将选择操作的URL,以便[Route(“api / Events”)]将localhost:29869 / api / Events映射到操作。

答案 1 :(得分:0)

如果您没有端口冲突,可以在Ensure that HttpConfiguration.EnsureInitialized()中引用Ian Mercer和gentiane的anwser。

希望它有所帮助。