C# Web API 2中的自定义路由。无法到达控制器方法

C# Web API 2中的自定义路由。无法到达控制器方法,c#,asp.net-web-api-routing,asp.net-web-api2,C#,Asp.net Web Api Routing,Asp.net Web Api2,我的控制器中有一种方法,我正试图达到: [HttpPost, ActionName("UpdateTitle")] public IHttpActionResult UpdateTitle(Guid playlistId, string title) { using (ITransaction transaction = Session.BeginTransaction()) { PlaylistManager.UpdateTitle(playlistId, ti

我的控制器中有一种方法,我正试图达到:

[HttpPost, ActionName("UpdateTitle")]
public IHttpActionResult UpdateTitle(Guid playlistId, string title)
{
    using (ITransaction transaction = Session.BeginTransaction())
    {
        PlaylistManager.UpdateTitle(playlistId, title);

        transaction.Commit();
    }

    return Ok();
}
我在控制器中有另一个方法,也是一个POST,是我的请求(错误)实际命中的方法:

以下是我的原始请求信息:

以下是我的路线:

public static class WebApiConfig
{
    //  TODO: Create test cases for custom routing.
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Routes.MapHttpRoute("UpdateTitle", "Playlist/UpdateTitle/{playlistId}/{title}");

        //  TODO: What does this do?
        // Web API routes
        //config.MapHttpAttributeRoutes();

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

    }
}

它究竟为什么要重定向到Create方法?在我看来,签名被路由到UpdateTitle方法是正确的。

尝试这样声明,看看是否有帮助(因为我相信您正在请求正文中发送参数:

public IHttpActionResult UpdateTitle([FromBody]Guid playlistId, [FromBody]string title)

首先,您需要创建一个包含所有表单数据的类。您可以使用PlayDTO类来实现此目的:

public class PlaylistDto
{
    public Guid PlaylistId { get; set; }
    public string title { get; set; }
}
然后将UpdateTitle方法更改为:

[HttpPost, ActionName("UpdateTitle")]
public IHttpActionResult UpdateTitle(PlaylistDto Dto)
{
    using (ITransaction transaction = Session.BeginTransaction())
    {
        PlaylistManager.UpdateTitle(Dto.playlistId, Dto.title);

        transaction.Commit();
    }

    return Ok();
}
最后,按如下方式更改您的路线:

public static class WebApiConfig
{
    //  TODO: Create test cases for custom routing.
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Routes.MapHttpRoute(
            name: "UpdateTitle",
            routeTemplate: "Playlist/UpdateTitle",
            defaults: new { controller = "PlaylistController", action = "UpdateTitle" }
         );    

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

    }
}

MapHttpAttributeRoutes用于启用属性路由。请查看此处并尝试进行路由调试和其他许多需要。我看不到图像(是的,因为imgur被公司代理阻止:-/),但您的路由配置没有考虑操作,因此就路由映射器而言,这两种方法都具有相同的route.Naw。问题显然是您不能在web API的主体中发布多个参数。这违反了它们的规则。应该进行修补,重新工作我的体系结构,以便我可以进行更新,或者做其他事情.我知道为什么会有帮助…但是,我有点不知所措。这是一个POST请求…这不意味着所有的信息都在正文中吗?为什么在MVC4中工作正常时需要在Web API中显式显示?另外,不允许用FromBody修饰多个参数。@SeanAnderson不意味着所有的信息都在正文中吗?-不可以。您可以在同一个请求中同时使用QueryString和Body参数。我只使用过WebAPI,但我注意到WebAPI和MVC有些不同(可以使用不同的API)-因此我的理解是,它们不是一回事。不确定多个参数-没有代码可供检查。
public static class WebApiConfig
{
    //  TODO: Create test cases for custom routing.
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Routes.MapHttpRoute(
            name: "UpdateTitle",
            routeTemplate: "Playlist/UpdateTitle",
            defaults: new { controller = "PlaylistController", action = "UpdateTitle" }
         );    

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

    }
}