【问题标题】:ASP.NET Web Api Routing BrokenASP.NET Web Api 路由损坏
【发布时间】:2015-02-09 21:46:53
【问题描述】:

我无法在我的 asp.net web api 项目中使用基本路由。我遵循了 asp.net (http://www.asp.net/web-api/overview/web-api-routing-and-actions) 上的示例,并在整个 stackoverflow 中进行了搜索,试图找到解决方案。无论我尝试过什么示例,我都无法让属性路由正常工作。

这是我的控制器:

public class EmployeeController : ApiController
{
    private readonly IRepository<Employee> _employees; 

    public EmployeeController(IRepository<Employee> repo)
    {
        _employees = repo;
    }


    [Route("")]
    public IEnumerable<Employee> GetEmployees()
    {
        return _employees.Queryable();
    }


    [Route("{id:int}")]
    public Employee GetEmployee(int id)
    {
        return _employees.Queryable().FirstOrDefault();
    }
}

这是我的 Global.asax.cs:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

这是我的 WebApiConfig.cs:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

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

无论我尝试什么,我都会得到一个 404 或者就像上面的代码一样,我会收到消息

未找到与请求 URI 匹配的 HTTP 资源 'http://localhost:2442/api/employee/1'。

在控制器“员工”上找不到与 请求。

带或不带整数参数。

【问题讨论】:

    标签: c# asp.net routing


    【解决方案1】:

    要么为你的控制器使用属性路由,要么不使用它。这意味着你需要用 RoutePrefix 来装饰你的控制器,而不是依赖于配置的路由。

    [RoutePrefix("api/employee")
    public class EmployeeController : ApiController
    {
        private readonly IRepository<Employee> _employees; 
        public EmployeeController(IRepository<Employee> repo)
        {
            _employees = repo;
        }
        [Route("")]
        public IEnumerable<Employee> GetEmployees()
        {
            return _employees.Queryable();
        }
        [Route("{id}")]
        public Employee GetEmployee(int id)
        {
            return _employees.Queryable().FirstOrDefault();
        }
    }
    

    或者在下面的例子中,我们依赖于定义的路由而不是使用属性路由。

    public class EmployeeController : ApiController
    {
        private readonly IRepository<Employee> _employees; 
        public EmployeeController(IRepository<Employee> repo)
        {
            _employees = repo;
        }
        public IEnumerable<Employee> GetEmployees()
        {
            return _employees.Queryable();
        }
        public Employee GetEmployee(int id)
        {
            return _employees.Queryable().FirstOrDefault();
        }
    }
    

    如果你混搭,就会混淆。

    【讨论】:

    • 感谢您解决这个问题。我的印象是方法上的 Route 属性优先于默认路由映射
    • @transporter_room_3 我相信它优先的原因是因为您在映射另一条路线之前有config.MapHttpAttributeRoutes();。但是,您收到错误的原因是没有路由前缀,因此您需要请求它的 URL 是 ~/1,因为根据我的经验,您不能将属性路由与普通路由混合匹配控制器。如果你不指定 RoutePrefix,我不相信它会使用在以后的路由中映射的控制器,这就是为什么 ~/api/employee/1 会给你一个错误。
    【解决方案2】:

    您是否尝试将 RoutePrefix 属性放在您的类上,如下所示:

    [RoutePrefix("api/employee")]
    public class EmployeeController : ApiController
    

    【讨论】:

    • 这就是诀窍,哇。但是我的印象是(通过阅读 asp.net 上的 tuts),您不必使用路由前缀属性?例如,我可以使用 [Route("api/employee/name")] 来赋予方法属性。但这似乎不起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2014-04-08
    相关资源
    最近更新 更多