我有一个asp.net web api项目,其中只有一个api控制器,里面只有一个get方法,没有别的。当我尝试运行它时,它显示如下错误
HTTP Error 403.14 - Forbidden
The Web server is configured to not list the contents of this directory.
[CacheOutput(ClientTimeSpan = 300, ServerTimeSpan = 300)]
public IEnumerable<Movie> Get()
{
return repository.GetEmployees().OrderBy(c => c.EmpId);
}
,网址为http://domain:53538/api/employees
和WebApiConfig是
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "SearchApi",
routeTemplate: "api/{controller}/{action}/{searchstr}"
);
config.Routes.MapHttpRoute(
name: "DefaultApiWithEmpId",
routeTemplate: "api/{controller}/{EmpId}",
defaults: new { employeeId = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
答案 0 :(得分:1)
最可能的原因是你在Global.asax Application_Start中遗漏了这个或类似的东西
GlobalConfiguration.Configure(config =>
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
});
这就是告诉应用程序如何映射到Web API Controller的内容。也就是说,根据您实体的结构,您可能会遇到不同的问题。我发现具有关系的实体不能很好地序列化,并且经常会抛出序列化错误,因为它会创建循环引用,因此您可能需要进入自定义对象以进行序列化。没有更多的信息,很难确定问题是什么。也可以使用API调用或Controller的结构。
我使用的模型会让你调用
$.get('/api/movies/get',,function(result) {});
这就是为什么我通常指定httpmethod并给api调用一个有意义的名字。
希望这足以从那里弄明白。
在看到更新后编辑
看起来你的映射太多了。简化您的映射,只需在1张地图上使用您的WebAPI即可。否则它只会混淆路由,并且不知道要去哪个地图。
在映射中,您有2个不同的控制器映射,可以处理相同的请求。 (第二个和第三个)他们都读取模式'api / [^ /] +(/ [^ /] *)?'
答案 1 :(得分:0)
在您的代码中,我可以看到以下内容对应于相同的路由网址。
config.Routes.MapHttpRoute(
name: "DefaultApiWithMovieId",
routeTemplate: "api/{controller}/{movieId}",
defaults: new { movieId = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
注意:在这两种情况下,最后一个参数被标记为可选,因此路由保留为api/{controller}
,当您使用api/movies
时,路由系统感到困惑并停止工作!
所以你只需要重新安排路由网址,我建议更换第一个(在我的回答中)
config.Routes.MapHttpRoute(
name: "DefaultApiWithMovieId",
routeTemplate: "api/{controller}/{movieId}"
);
因此,这会将movieid
参数设为强制性,它将具有网址/api/movies/2
,此处2为电影ID
,后者将对应api/movies
(因为id
这里是可选的 - 参考我的答案中的第二个代码块),以便您的解决方案能够正常工作,