Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API中一个动词的三个路由_C#_Asp.net Web Api_Asp.net Mvc Routing_Asp.net Web Api Routing - Fatal编程技术网

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
    -列出所有类别
  • GET/api/category/1
    -获取关于category 1的详细信息
  • GET/api/category/1/问题
    -从类别1获取问题
我很难让这个路由正常工作

My
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
字段使用了不同的名称之后,我才能让它工作。非常不直观,但嘿,它很有效!:)