WebAPI 2自定义路由

时间:2019-08-20 20:22:03

标签: c# asp.net asp.net-web-api routing

我已使用框架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我应该怎么做?

4 个答案:

答案 0 :(得分:0)

您可能会混合使用两种方法来实现Net框架中的WebApi,如Microsoft文档-https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/routing-and-action-selection中所述。

在第一个(您要跟踪的)中,路由匹配是通过动词的参数(GET,POST,PUT,DELETE)进行的,这意味着在执行Get时,您可以使用参数的来区分方法名称(示例在前面提到的Microsoft文档中可用)。

在第二个中,您可以在顶部添加一个Route和controller路由,以告诉编译器应该在哪个路由中公开该方法。

答案 1 :(得分:0)

我没有时间测试VS的建议,但我认为您需要再添加一个属性-RoutePrefixAttribute
您的代码应如下:

[RoutePrefix( "api/ShapeFileAnalysis" )]    //  new line of code!
public class ShapeFileAnalysisController : ApiController
{
    [HttpGet]
    [Route("GetDataValues")]
    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public HttpResponseMessage GetDataValues()
    {

    }  
}

答案 2 :(得分:0)

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

您的路线只有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
    }  
}

引用Attribute Routing in ASP.NET Web API 2

答案 3 :(得分:0)

对于这种情况,为“ mysite.com/api/ShapeFileAnalysis/GetDataValues” 如果所有请求都在此模板中。 您不必使用“自定义路线”

另一个答案是解决问题的方法,但是我想提供另一种选择。 更改默认路由删除所有路由属性。 路线模板添加操作标签。

示例:

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}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

引用:Routing in ASP.NET Web API