C# Web API中一个动词的三个路由
我正在尝试以下三种方法:C# Web API中一个动词的三个路由,c#,asp.net-web-api,asp.net-mvc-routing,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Mvc Routing,Asp.net Web Api Routing,我正在尝试以下三种方法: GET/api/category-列出所有类别 GET/api/category/1-获取关于category 1的详细信息 GET/api/category/1/问题-从类别1获取问题 我很难让这个路由正常工作 MyCategoryController具有以下三种方法定义: public IEnumerable<Category> Get() {} public Category Get(int id) {} public IEnumerable<
-列出所有类别GET/api/category
-获取关于category 1的详细信息GET/api/category/1
-从类别1获取问题GET/api/category/1/问题
CategoryController
具有以下三种方法定义:
public IEnumerable<Category> Get() {}
public Category Get(int id) {}
public IEnumerable<QuestionSummary> GetQuestions(int id) {}
public IEnumerable Get(){}
公共类别Get(int-id){}
公共IEnumerable GetQuestions(int-id){}
我怎样才能使它们相互匹配而不冲突?我们在项目的其他部分使用了AttributeRouting。我认为,除非您使用“action”,否则在同一个控制器上不能对同一动词使用多个方法 我想你可以使用3个不同的控制器处理你的3条路线,只要你按照正确的顺序注册它们
config.Routes.MapHttpRoute(
name: "Route1",
routeTemplate: "/api/category/{id}/questions",
controllerType: typeof(YourController1)
);
config.Routes.MapHttpRoute(
name: "Route2",
routeTemplate: "/api/category/{id}",
controllerType: typeof(YourController2)
);
config.Routes.MapHttpRoute(
name: "Route3",
routeTemplate: "/api/category",
controllerType: typeof(YourController3)
);
我不认为在同一个控制器上可以对同一个动词使用多个方法,除非使用“action” 我想你可以使用3个不同的控制器处理你的3条路线,只要你按照正确的顺序注册它们
config.Routes.MapHttpRoute(
name: "Route1",
routeTemplate: "/api/category/{id}/questions",
controllerType: typeof(YourController1)
);
config.Routes.MapHttpRoute(
name: "Route2",
routeTemplate: "/api/category/{id}",
controllerType: typeof(YourController2)
);
config.Routes.MapHttpRoute(
name: "Route3",
routeTemplate: "/api/category",
controllerType: typeof(YourController3)
);
以下方面应起作用:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "SubResource",
routeTemplate: "api/{controller}/{categoryId}/{action}"
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
和您的控制器:
public class CategoryController : ApiController
{
public IEnumerable<Category> Get()
{
...
}
public Category Get(int id)
{
...
}
[HttpGet]
public IEnumerable<QuestionSummary> Questions(int categoryId)
{
...
}
}
公共类CategoryController:ApicController
{
公共IEnumerable Get()
{
...
}
公共类别获取(int-id)
{
...
}
[HttpGet]
公共IEnumerable问题(int类)
{
...
}
}
ASP.NET Web API 2使此场景更加容易,因为它允许使用
我相信微软最终会做对的。希望在ASP.NET Web API 3中,他们将引入基于消息的路由,并且他们将以正确的方式完成REST框架-它将基于消息,并且将在这些消息上完成路由。以下操作应该有效:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "SubResource",
routeTemplate: "api/{controller}/{categoryId}/{action}"
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
和您的控制器:
public class CategoryController : ApiController
{
public IEnumerable<Category> Get()
{
...
}
public Category Get(int id)
{
...
}
[HttpGet]
public IEnumerable<QuestionSummary> Questions(int categoryId)
{
...
}
}
公共类CategoryController:ApicController
{
公共IEnumerable Get()
{
...
}
公共类别获取(int-id)
{
...
}
[HttpGet]
公共IEnumerable问题(int类)
{
...
}
}
ASP.NET Web API 2使此场景更加容易,因为它允许使用
我相信微软最终会做对的。希望在ASP.NET Web API 3中,他们将引入基于消息的路由,并且他们将以正确的方式完成REST框架-它将基于消息,路由将在这些消息上完成。在这种情况下,您将如何使用“操作”?使用上述定义时,如何禁用此控制器的现有路由?使用操作时,您必须修改路由模板。例如:/api/category->/api/category/list,其中list是操作。我理解,如果您已经交付api,则不可行;我刚才提到了在同一个控制器上处理同一谓词的多个方法的选项。在这种情况下,如何使用“action”?使用上述定义时,如何禁用此控制器的现有路由?使用操作时,您必须修改路由模板。例如:/api/category->/api/category/list,其中list是操作。我理解,如果您已经交付api,则不可行;我刚才提到了在同一控制器上为同一谓词处理多个方法的选项。您在技术上是正确的,但我无法让它工作,直到我在不同的路由中为
id
字段使用了不同的名称。非常不直观,但嘿,它很有效!:)您在技术上是正确的,但直到我在不同的路由中为id
字段使用了不同的名称之后,我才能让它工作。非常不直观,但嘿,它很有效!:)