C# API突然停止工作,使用常规web路由

C# API突然停止工作,使用常规web路由,c#,asp.net,asp.net-mvc,routing,C#,Asp.net,Asp.net Mvc,Routing,我正在处理一个asp.net项目,突然,似乎出乎意料地,API停止了专门针对使用/API/{controller}/{id}路由的路由的工作 例如,使用/api/Events?param1=x¶m2=y可以正常工作。只是在使用可选参数{id}时,它似乎回到了常规web路由:/{controller}/{action}/{id} 以下是相关配置: WebApiConfig.cs: public static void Register(HttpConfiguration confi

我正在处理一个asp.net项目,突然,似乎出乎意料地,API停止了专门针对使用
/API/{controller}/{id}
路由的路由的工作

例如,使用
/api/Events?param1=x¶m2=y
可以正常工作。只是在使用可选参数
{id}
时,它似乎回到了常规web路由:
/{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 }
        );
    }
    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 }
        );
    }
RouteConfig.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 }
        );
    }
    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();
            }
        }
    }
//GET:api/Events/5
[HttpGet]
要获取的公共事件readd(int-id)
{
使用(var session=DBSessionFactory.OpenSession())
{
使用(ITransaction transaction=session.BeginTransaction())
{
返回会话。查询()
.其中(e=>e.Id==Id)
托利斯先生()
.Select(x=>Mapper.Map(x))
.FirstOrDefault();
}
}
}

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

telerik reporting“wizard”放置在
Global.asax
中的行似乎会导致注册一条与ASP.NET MVC API创建的默认路由冲突的路由

令人不快的是:

Telerik.Reporting.Services.WebApi.ReportsControllerConfiguration.RegisterRoutes(System.Web.Http.GlobalConfiguration.Configuration);
为了解决我的问题,我将线路从
Global.asax
的顶部移动到最后一次线路配置之后:

    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();
    }
这就解决了问题