WebAPI 2 自定义路由
WebAPI 2 custom routing
我已将客户路由添加到 WebAPI ASP.NET 应用程序,使用框架 4.7.1,方法是在方法顶部添加属性:
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 }
);
}
}
我应该怎么做才能保留我的网站。com/api/ShapeFileAnalysis/GetDataValues ?
您可能混合使用两种方法在 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 you使用参数名称区分方法(示例在前面提到的 Microsoft 文档中可用)。
在第二个中,您可以在顶部添加一个路由和控制器路由,以告诉编译器应该在哪个路由中公开该方法。
我没有时间在 VS 中测试我的建议,但我相信您需要再添加一个属性 - RoutePrefixAttribute。
您的代码应如下所示:
[RoutePrefix( "api/ShapeFileAnalysis" )] // new line of code!
public class ShapeFileAnalysisController : ApiController
{
[HttpGet]
[Route("GetDataValues")]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public HttpResponseMessage GetDataValues()
{
}
}
属性路由使用放置在属性中的路由模板。
你的路线只有 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
}
}
对于这种情况"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 }
);
}
}
我已将客户路由添加到 WebAPI ASP.NET 应用程序,使用框架 4.7.1,方法是在方法顶部添加属性:
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 }
);
}
}
我应该怎么做才能保留我的网站。com/api/ShapeFileAnalysis/GetDataValues ?
您可能混合使用两种方法在 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 you使用参数名称区分方法(示例在前面提到的 Microsoft 文档中可用)。
在第二个中,您可以在顶部添加一个路由和控制器路由,以告诉编译器应该在哪个路由中公开该方法。
我没有时间在 VS 中测试我的建议,但我相信您需要再添加一个属性 - RoutePrefixAttribute。
您的代码应如下所示:
[RoutePrefix( "api/ShapeFileAnalysis" )] // new line of code!
public class ShapeFileAnalysisController : ApiController
{
[HttpGet]
[Route("GetDataValues")]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public HttpResponseMessage GetDataValues()
{
}
}
属性路由使用放置在属性中的路由模板。
你的路线只有 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
}
}
对于这种情况"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 }
);
}
}