【问题标题】:How to pass parameters to web api2如何将参数传递给web api2
【发布时间】:2016-01-13 15:39:33
【问题描述】:

控制器签名:

public class UserAlertsController : ApiController

public IHttpActionResult Post(Guid id, List<long> users)

路线:

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

邮递员请求:

http://localhost:50828/api/UserAlerts/4af3fee7-84ae-48fa-9215-45a00c35dbf

Content-Type application/json

[1,2]

通过上述设置,我收到了消息:

"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry
                  for parameter 'id' of non-nullable type 'System.Guid'"

我也使用标准的 global.asax

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

谁能告诉我哪里出错了

如果我将操作签名更改为:

public IHttpActionResult Post(string id, long[] users)

那么就绑定正确了,但是如果把id改成Guid就会报错。

【问题讨论】:

  • 您将 guid 作为路由参数传递,但您的路由与您使用的 url 不匹配。

标签: c# rest routes asp.net-web-api2 model-binding


【解决方案1】:

编辑

你错误地传递了不是GUID的4af3fee7-84ae-48fa-9215-45a00c35dbf,你应该传递4af3fee7-84ae-48fa-9215-45a00c35dbf6注意最后的6

基于您的原始问题

问题在于你的路由,你应该使用:"api/{controller}/{id}" 作为路由 url 模板。

您将 guid 作为路由参数传递,但您的路由与您使用的 url 不匹配。

打开WebApi.Config,将你的默认路由改成这个路由:

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

还要确保您已在global.asax 中注册了您的WebApiConfig Application_Start

GlobalConfiguration.Configure(WebApiConfig.Register);

旁注:

默认情况下,Web API 使用以下规则绑定参数:

  • 如果参数是“简单”类型,Web API 会尝试从 URI 中获取值。简单类型包括 .NET 基本类型(int、bool、double 等),加上 TimeSpan、DateTime、Guid、decimal 和 string,以及任何具有可以从字符串转换的类型转换器的类型。

  • 对于复杂类型,Web API 尝试使用媒体类型格式化程序从消息正文中读取值。

【讨论】:

    【解决方案2】:

    您传递的 GUID 值在标题中。您可以通过FromUri 属性指定要从 uri 接收值:

    public IHttpActionResult Post([FromUri]Guid id, List<long> users)
    

    另一个问题是您的 HTTP URL 中有“api”部分:

    http://localhost:50828/api/UserAlerts/4af3fee7-84ae-48fa-9215-45a00c35dbf
    

    虽然您的控制器在声明中缺少它。从您的网址中删除“api”部分,或将其添加到您的路线中。

    要么这样:

    http://localhost:50828/UserAlerts/4af3fee7-84ae-48fa-9215-45a00c35dbf
    

    或者在MapRoute下修改你的url

    url: "api/{controller}/{action}/{id}",
    

    【讨论】:

    • 谢谢。我不能发送查询字符串中的 guid 和正文中的列表吗?
    • 操作将 guid 作为路由参数传递,但他的路由与他使用的 url 不匹配。
    • @DavidB 我错过了您在 URI 中发送 guid 的事实。编辑了我的答案。
    • 我删除了 api,或者更改了我得到 404 的路由。我添加了 FromURI 属性,但得到了同样的问题
    • 刚刚意识到我有另一个路由设置覆盖了第一个。已编辑帖子。它确实包含'api' :) 抱歉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多