我制作了一个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>
答案 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。
希望它有所帮助。