【问题标题】:Route Attribute not working in Web API 2路由属性在 Web API 2 中不起作用
【发布时间】:2016-12-19 22:05:14
【问题描述】:

我的 API 控制器上有两个 GET 方法。当我尝试调用使用路由属性修饰的GetByCompanyId 方法时,请求被路由到GetById 方法。下面是相关的代码文件。

global.ascx.cs

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

webApiConfig

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.EnableCors();

        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

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

    }
}

route.config

public class RouteConfig
{
    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 }
        );
    }
}

CompanyFunctionsController.cs

public IHttpActionResult GetById(int id)
{
    var companyFunction = this._service.GetByKey(new object[] { id });

    if (companyFunction != null)
    {
        var companyFunctionDto = Mapper.Map<CompanyFunctionDto>(companyFunction);

        return Ok(companyFunctionDto);
    }

    return NotFound();
}

[Route("CompanyFunctions/GetByCompanyId", Name = "GetByCompanyId")]
[HttpGet]
public IEnumerable<CompanyFunctionDto> GetByCompanyId(int id)
{
    var collection = this._service.GetAll().ToList().Where(x => x.CompanyId == id);

    IEnumerable<CompanyFunctionDto> collectCompanyFunctionDtos = Mapper.Map<IEnumerable<CompanyFunctionDto>>(collection);

    return collectCompanyFunctionDtos;
}

我的 HTTP 请求: http://localhost:1317/api/CompanyFunctions/GetByCompanyId?id=1

【问题讨论】:

    标签: asp.net-web-api2


    【解决方案1】:

    如果你想要一个以api 开头的路由,比如http://localhost:1317/api/CompanyFunctions/GetByCompanyId?id=1,那么你必须在你希望它去的路由属性中使用字符串api

    [Route("api/CompanyFunctions/GetByCompanyId", Name = "GetByCompanyId")]
    

    否则只会根据http动词匹配(本例为Get)。

    或者,您也可以使用 [RoutePrefix("api/CompanyFunctions")] 属性装饰 Web api 控制器,并将您的 Route 属性更改为 [Route("GetByCompanyId", Name = "GetByCompanyId")]

    【讨论】:

    • 谢谢伊戈尔,这就是问题所在,我没有api
    【解决方案2】:

    Web API 2 支持一种新的路由类型,称为属性路由。顾名思义,属性路由使用属性来定义路由。属性路由让您可以更好地控制 Web API 中的 URI 您可以使用 Web Api 中的属性路由来解决您的问题。你的 Controller Action 应该是这样的,

        [Route("CompanyFunctions/GetByCompanyId/{companyId}"]
     public IEnumerable<CompanyFunctionDto> GetByCompanyId(int companyId)
     {
        var collection = this._service.GetAll().ToList().Where(x => x.CompanyId == companyId);
    
        IEnumerable<CompanyFunctionDto> collectCompanyFunctionDtos = Mapper.Map<IEnumerable<CompanyFunctionDto>>(collection);
    
        return collectCompanyFunctionDtos;
     }
    

    你的 HTTP 请求是http://localhost:1317/CompanyFunctions/GetByCompanyId/1

    【讨论】:

    • 感谢 Safal,我最终加入了那个 {companyId}(虽然我最后做了 {id}。这很有帮助!:)
    猜你喜欢
    • 2013-11-11
    • 2017-09-19
    • 2015-03-19
    • 2021-08-27
    • 2017-03-24
    • 1970-01-01
    • 2014-03-25
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多