【问题标题】:API suddenly stopped working, using regular web routesAPI 突然停止工作,使用常规网络路由
【发布时间】:2017-03-01 13:12:46
【问题描述】:

我正在处理一个 asp.net 项目,突然间,似乎出乎意料的是,API 已停止专门为使用 /api/{controller}/{id} 路由的路由工作。

使用,例如 /api/Events?param1=x&param2=y 工作正常。只是在使用可选参数{id} 时,它似乎回退到常规网络路由:/{controller}/{action}/{id}

以下是相关配置:

WebApiConfig.cs:

    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Formatters.JsonFormatter.SupportedMediaTypes
            .Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

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

RouteConfig.cs:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

和 Global.asax:

    protected void Application_Start()
    {
        Telerik.Reporting.Services.WebApi.ReportsControllerConfiguration.RegisterRoutes(System.Web.Http.GlobalConfiguration.Configuration);
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AutoMapperConfig.RegisterMaps();
    }

其中一项无效操作的示例:

    // GET: api/Events/5
    [HttpGet]
    public EventReadDTO Get(int id)
    {
        using (var session = DBSessionFactory.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                return session.Query<Event>()
                    .Where(e => e.Id == id)
                    .ToList()
                    .Select(x => Mapper.Map<EventReadDTO>(x))
                    .FirstOrDefault();
            }
        }
    }

【问题讨论】:

    标签: c# asp.net asp.net-mvc routing


    【解决方案1】:

    这对于任何使用 Telerik Reporting 的人来说都是值得的。

    看来 Telerik 报告“向导”在 Global.asax 中放置的行会导致注册的路由干扰 ASP.NET MVC API 创建的默认路由。

    违规行是:

    Telerik.Reporting.Services.WebApi.ReportsControllerConfiguration.RegisterRoutes(System.Web.Http.GlobalConfiguration.Configuration);
    

    为了解决我的问题,我将Global.asaxtop行移到最后一次路由配置发生后:

        protected void Application_Start()
        {            
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            Telerik.Reporting.Services.WebApi.ReportsControllerConfiguration.RegisterRoutes(System.Web.Http.GlobalConfiguration.Configuration);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AutoMapperConfig.RegisterMaps();
        }
    

    这样就解决了问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-10
      • 2016-09-03
      • 2020-12-21
      • 1970-01-01
      • 2022-01-20
      • 2016-07-18
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多