如何将参数传递给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
中注册了您的 WebApiConfig
在 Application_Start
:
GlobalConfiguration.Configure(WebApiConfig.Register);
旁注:
默认情况下,Web API 使用以下规则绑定参数:
如果参数是“简单”类型,Web API 会尝试从 URI 中获取值。简单类型包括 .NET 基元类型(int、bool、double 等),加上 TimeSpan、DateTime、Guid、decimal 和 string,以及任何具有可以从字符串转换的类型转换器的类型。
对于复杂类型,Web API 尝试使用媒体类型格式化程序从消息正文中读取值。
控制器签名:
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
中注册了您的 WebApiConfig
在 Application_Start
:
GlobalConfiguration.Configure(WebApiConfig.Register);
旁注:
默认情况下,Web API 使用以下规则绑定参数:
如果参数是“简单”类型,Web API 会尝试从 URI 中获取值。简单类型包括 .NET 基元类型(int、bool、double 等),加上 TimeSpan、DateTime、Guid、decimal 和 string,以及任何具有可以从字符串转换的类型转换器的类型。
对于复杂类型,Web API 尝试使用媒体类型格式化程序从消息正文中读取值。