运行web api时出错

时间:2014-10-15 15:55:48

标签: asp.net asp.net-mvc iis asp.net-web-api

我有一个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 }
            );

        }

2 个答案:

答案 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这里是可选的 - 参考我的答案中的第二个代码块),以便您的解决方案能够正常工作,