WebAPI C#路由

WebAPI C#路由,c#,asp.net-web-api,C#,Asp.net Web Api,我有两个结论: api/v1/user/session(用于通过post请求创建用户登录) api/v1/user(用于通过post请求创建用户) 如何在同一控制器中路由这两个端点?我还想为特定请求指定操作。更清楚地说: 所有get、post、update和patch操作都可以在api/v1/user/session端点中完成 所有获取、发布、更新和修补操作都可以在api/v1/user endpoint中完成 可能吗 例如: config.Routes.MapHttpRoute(

我有两个结论:

  • api/v1/user/session
    (用于通过post请求创建用户登录)
  • api/v1/user
    (用于通过post请求创建用户)
如何在同一控制器中路由这两个端点?我还想为特定请求指定操作。更清楚地说:

所有get、post、update和patch操作都可以在api/v1/user/session端点中完成

所有获取、发布、更新和修补操作都可以在api/v1/user endpoint中完成

可能吗

例如:

config.Routes.MapHttpRoute(
    "UserApi",
    "api/v1/{controller}/session",
    new { controller = "User", action="Session" });
现在,我希望所有rest请求都能用于具有[httpPost]、[httpGet]等属性的会话方法

       config.Routes.MapHttpRoute("lol", "api/v1/{controller}/session", 
            new { controller = "User", action="Session" });

        //config.Routes.MapHttpRoute(
        //    name: "LoginApi",
        //    routeTemplate: "api/v1/{controller}",
        //    defaults: new { controller = "User"}
        //);

        config.Routes.MapHttpRoute(
            name: "RailStationApi",
            routeTemplate: "api/v1/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

我建议您看看-这比使用中央配置更容易指定

[RoutePrefix("api/v1")]
public class UserController : ApiController {

    [HttpPost]
    [Route("user/session")]
    public void Login(/*...*/) {
        // ...
    }

    [HttpGet]
    [Route("user/session")]    // Note this has the same route as Login
    public SessionResult GetSession(/*...*/) {
        // ...
    }

    [HttpPost]
    [Route("user")]
    public void CreateUser(/*...*/) {
        // ...
    }

}

请注意,从技术上讲,您不需要
[HttpPost]
,因为这是默认设置,但为了清晰起见,我将其包括在内。您可以用同样的方法添加带有其他Http谓词的方法。

我使用硬编码解决方案进行了尝试,效果很好。我在webapi.config文件中添加了下面的路由,它成功了

RouteTable.Routes.MapHttpRoute(
            name: "SessionApi",
            routeTemplate: "api/v1/user/session",
            defaults: new { Controller = "Session", id = RouteParameter.Optional }
        ).RouteHandler = new SessionStateRouteHandler();

这是完全可能的。查看您尝试过的内容会很有帮助,这样我们就可以看到您遇到的问题。@dmsbilas您可以编辑您的问题,向我们展示您的所有(相关)路线吗?路由是按照它们添加到Routes集合的顺序进行评估的,因此,如果我们能够更全面地了解您所做的工作,那就太好了。我已经创建了UserController。我希望api/user/session端点将所有[httpGet]、[httpPost]等用于此特定会话方法。我还有另一个端点api/用户端点。添加我的路由后,我的api/用户/会话路由工作,但api/用户路由不工作。