【问题标题】:Error in running web api运行 web api 时出错
【发布时间】:2014-11-24 11:43:15
【问题描述】:

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

        }

【问题讨论】:

  • 输入您的代码以及调用该 API 的方式。
  • 您调用的网址是什么?
  • 更新了问题
  • 包含上述代码的类名是什么?是moviesController 吗?

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


【解决方案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 控制器的内容。也就是说,根据实体的结构,您之后可能会遇到不同的问题。我发现具有关系的实体不能很好地序列化并且经常会抛出序列化错误,因为它会创建循环引用,因此您可能需要进入自定义对象以进行序列化。如果没有更多信息,很难确定问题出在哪里。也可能与 API 调用或控制器的结构有关。

我使用的模型会让你打电话

$.get('/api/movies/get',,function(result) {});

这就是为什么我通常会指定 http 方法并给 api 调用一个有意义的名称。

希望这足以从那里弄清楚。

看到更新后编辑

您的映射中似乎有太多内容。简化您的映射,只需在一张地图上使用您的 WebAPI。否则只会混淆路由,不知道去哪张地图。

在您的映射中,您有 2 个不同的控制器映射可以处理相同的请求。 (第二个和第三个)他们都读到了模式'api/[^/]+(/[^/]*)?'

【讨论】:

    【解决方案2】:

    在您的代码中,我可以看到以下对应于相同的路由 url。

     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 时,路由系统会混淆并停止工作!

    所以你只需要重新安排路由 url,我建议替换第一个(在我对此的回答中)

    config.Routes.MapHttpRoute(
                   name: "DefaultApiWithMovieId",
                   routeTemplate: "api/{controller}/{movieId}"
    
               );
    

    所以这将使 movieid 参数成为强制性参数,它将有 url /api/movies/2 ,这里 2 是电影 ID

    后者将对应于api/movies(因为id 这里是可选的 - 指的是我的答案中的第二个代码块),以便您的解决方案有效,

    【讨论】:

      猜你喜欢
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2016-05-13
      • 2017-12-04
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      相关资源
      最近更新 更多