【发布时间】:2017-03-24 22:35:17
【问题描述】:
我有一个生成的实体框架 API 控制器,我现在正在尝试向它添加一个新方法:
[ResponseType(typeof(LCPreview))]
public IHttpActionResult ValidateEmail(string email)
{
LCPreview lCPreview = db.Data.Find(5);
if (lCPreview == null)
{
return NotFound();
}
return Ok(lCPreview);
}
但是当我运行它时,我得到了这个错误:
请求无效。参数字典包含“Astoria.Controllers.PreviewLCAPIController”中方法“System.Web.Http.IHttpActionResult GetLCPreview(Int32)”的不可空类型“System.Int32”的参数“id”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
【问题讨论】:
-
您是否检查了从 db.Data.Find 调用返回的对象? id 字段可能为空值。
-
我设置了一个断点,它根本没有达到那个新方法
-
路由冲突。它正在访问与请求匹配的另一条路线。展示您如何配置您的路线设置。以及被请求的网址
-
从堆栈跟踪来看,它看起来像是在使用空参数访问 GetLCPreview(Int32)。
-
我将冒险尝试并假设您正在使用 GET 请求来尝试使用此方法。默认情况下,我相信任何没有的路由名称(或标有 HTTPGet 属性)都将默认为 POST。因此,您要么需要将此标记为 GET 请求,要么将调用更改为 POST
标签: c# asp.net-mvc entity-framework asp.net-web-api asp.net-web-api-routing