【问题标题】:WebAPI 2 custom routingWebAPI 2 自定义路由
【发布时间】:2019-12-26 02:35:37
【问题描述】:

我已使用框架 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.net asp.net-web-api routing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        我没有时间在 VS 中测试我的建议,但我相信您需要再添加一个属性 - RoutePrefixAttribute
        您的代码应如下所示:

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

        【讨论】:

          【解决方案4】:

          对于这种情况“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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-05
            • 1970-01-01
            • 2016-05-10
            • 1970-01-01
            • 2019-02-04
            • 2014-04-26
            相关资源
            最近更新 更多