如何将参数传递给web api2

How to pass parameters to web api2

控制器签名:

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 值在 header 中。您可以通过 FromUri 属性指定要从 uri 接收值:

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

另一个问题是您的 HTTP URL:

中有 "api" 部分
http://localhost:50828/api/UserAlerts/4af3fee7-84ae-48fa-9215-45a00c35dbf

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

或者这个:

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

或者在MapRoute下修改你的url:

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

编辑

你传递的4af3fee7-84ae-48fa-9215-45a00c35dbf不是GUID是错误的,你应该传递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 中注册了您的 WebApiConfigApplication_Start:

GlobalConfiguration.Configure(WebApiConfig.Register);

旁注:

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

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

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