[英]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,则会引发错误。
编辑
您传递4af3fee7-84ae-48fa-9215-45a00c35dbf
GUID的4af3fee7-84ae-48fa-9215-45a00c35dbf
犯了一个错误,应该传递4af3fee7-84ae-48fa-9215-45a00c35dbf6
注意最后的6 。
根据您的原始问题
问题出在您的路线上,您应该使用: "api/{controller}/{id}"
作为路线网址模板。
您将guid作为路由参数传递,但是您的路由与您使用的网址不匹配。
打开WebApi.Config
并将默认路由更改为此路由:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
还要确保已在Application_Start
global.asax
中注册了WebApiConfig
:
GlobalConfiguration.Configure(WebApiConfig.Register);
边注:
默认情况下,Web API使用以下规则来绑定参数:
如果参数是“简单”类型,则Web API会尝试从URI中获取值。 简单类型包括.NET基本类型(int,bool,double等),以及TimeSpan,DateTime,Guid,十进制和字符串,以及带有可从字符串转换的类型转换器的任何类型。
对于复杂类型,Web API尝试使用媒体类型格式化程序从消息正文中读取值。
您要传递的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}",
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.