首页 > 解决方案 > WebAPI 2 自定义路由

问题描述

我已使用框架 4.7.1 通过在方法顶部添加属性将自定义路由添加到 WebAPI ASP.NET 应用程序:

public class ShapeFileAnalysisController : ApiController
{
    [HttpGet]
    [Route("GetDataValues")]
    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public HttpResponseMessage GetDataValues()
    {
        string result = Models.ShapeFileReader.GetAdmin2();
        HttpResponseMessage response = this.Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StringContent(result, Encoding.UTF8, "application/json");
        return response;
    }  
}

但是当我添加 [Route("...")} 属性时,完整的 URL 将从 mysite.com/api/ShapeFileAnalysis 更改为 mysite.com/GetDataValues

webapiconfig.cs 是:

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

        // Web API routes
        config.MapHttpAttributeRoutes();

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

我应该怎么做才能仍然 mysite.com/api/ShapeFileAnalysis/GetDataValues ?

标签: c#asp.netasp.net-web-apirouting

解决方案


属性路由使用放置在属性中的路由模板。

您的路线只有GetDataValues这样才能成为完整的路线路径。

mysite.com/GetDataValues

如果您放置所需的路由路径

//GET api/ShapeFileAnalysis/GetDataValues
[HttpGet]
[Route("api/ShapeFileAnalysis/GetDataValues")]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public HttpResponseMessage GetDataValues() {
    //...
} 

然后你会得到想要的路径

mysite.com/api/ShapeFileAnalysis/GetDataValues

您可以使用该[RoutePrefix]属性为整个控制器设置一个公共前缀

[RoutePrefix( "api/ShapeFileAnalysis" )] 
public class ShapeFileAnalysisController : ApiController {

    //GET api/ShapeFileAnalysis/GetDataValues
    [HttpGet]
    [Route("GetDataValues")]
    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public HttpResponseMessage GetDataValues() {
        //...omitted for brevity
    }  
}

ASP.NET Web API 2 中的引用属性路由


推荐阅读