C# 如何将参数传递到web api2

C# 如何将参数传递到web api2,c#,rest,routes,asp.net-web-api2,model-binding,C#,Rest,Routes,Asp.net Web Api2,Model Binding,控制器签名: public class UserAlertsController : ApiController public IHttpActionResult Post(Guid id, List<long> users) 邮递员要求: http://localhost:50828/api/UserAlerts/4af3fee7-84ae-48fa-9215-45a00c35dbf Content-Type application/json [1,2] 通过上述设置,我

控制器签名:

public class UserAlertsController : ApiController

public IHttpActionResult Post(Guid id, List<long> users)
邮递员要求:

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值位于标头中。您可以通过
FromUri
属性指定要从uri接收的值:

public IHttpActionResult Post([FromUri]Guid id, List<long> users)
而您的控制器在声明中缺少它。从url中删除“api”部分,或将其添加到路由中

或者:

http://localhost:50828/UserAlerts/4af3fee7-84ae-48fa-9215-45a00c35dbf
或者在
MapRoute
下修改您的
url

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

您错误地传递了不是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

GlobalConfiguration.Configure(WebApiConfig.Register);
旁注:

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

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

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


谢谢。我不能在查询字符串中发送guid,在正文中发送列表吗?op正在将guid作为路由参数传递,但他的路由与他使用的url不匹配。@DavidB我忽略了您在URI中发送guid的事实。编辑了我的答案。我删除了api,或者改变了路线,得到了404。我添加了FromURI属性,但得到了相同的问题我刚意识到我有另一个路由设置覆盖了第一个。我编辑了这篇文章。它确实包含“api”:)很抱歉,您正在将guid作为路由参数传递,但您的路由与您正在使用的url不匹配。
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
GlobalConfiguration.Configure(WebApiConfig.Register);