【问题标题】:Custom routing in Web API 2. Failing to reach controller methodWeb API 2 中的自定义路由。无法到达控制器方法
【发布时间】:2014-03-11 18:02:00
【问题描述】:

我的控制器内部有一个方法,我正在尝试访问:

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

        transaction.Commit();
    }

    return Ok();
}

我在控制器中有另一种方法,它也是一个 POST,它实际上是被我的请求(错误地)命中的方法:

[HttpPost]
public PlaylistDto Create(PlaylistDto playlistDto)

我的原始请求信息如下所示:

这是我的路线:

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 方法。

【问题讨论】:

  • MapHttpAttributeRoutes 是开启属性路由。看看这里asp.net/web-api/overview/web-api-routing-and-actions/… 并尝试getglimpse.com 以满足您的路线调试和许多其他需求。
  • 我看不到图像(是的,imgur 被公司代理阻止:-/),但就路由映射器而言,您的路由配置未考虑操作, 两种方法都有相同的路线。
  • 不。问题绝对是您不能在正文中为 Web API 发布多个参数。违背了他们的规则。应该是 PATCHing,重新设计我的架构,这样我就可以进行更新,或者别的什么。

标签: c# asp.net-web-api-routing asp.net-web-api2


【解决方案1】:

首先,您需要创建一个包含所有表单数据的类。您也许可以为此使用 PlaylistDto 类:

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 }
        );

    }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我明白为什么这会有所帮助......但是,我有点不知所措。这是一个 POST 请求……这不意味着所有信息都在正文中吗?为什么在 MVC4 中运行良好时需要在 Web API 中显式?另外,你不能用 FromBody 装饰多个参数。
    • @SeanAnderson 这不意味着所有信息都在正文中吗? - 不。您可以在同一个请求中同时包含 QueryString 和 Body 参数。我只使用过 WebAPI,但我注意到 WebAPI 和 MVC 有些不同(可用的 API 不同) - 所以我的理解是它们不是一回事。不确定多个参数 - 没有方便的 atm 代码检查。
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多