ASP.NET Entity Framework API 控制器添加方法无效
ASP.NET Entity Framework API Controller Add method not working
我有一个生成的 Entity Framework API 控制器,我现在正尝试向它添加一个新方法:
[ResponseType(typeof(LCPreview))]
public IHttpActionResult ValidateEmail(string email)
{
LCPreview lCPreview = db.Data.Find(5);
if (lCPreview == null)
{
return NotFound();
}
return Ok(lCPreview);
}
但是当我 运行 这个时,我得到这个错误:
The request is invalid. The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Http.IHttpActionResult GetLCPreview(Int32)' in 'Astoria.Controllers.PreviewLCAPIController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
通过基于约定的路由,路由 table 无法区分这两个操作,并且正在根据 Get
前缀约定选择 GetLCPreview
操作。
鉴于您的路由配置已经启用属性路由,这意味着可以使用参数约束来帮助区分路由。
[RoutePrefix("api/PreviewLCAPI")]
public class PreviewLCAPIController : ApiController {
//GET api/PreviewLCAPI/5 <- only when the value is an int will it match.
[Route("{id:int}")]
[HttpGet]
public IHttpActionResult GetLCPreview(int id) { ... }
//GET api/PreviewLCAPI/someone@email.com/
[Route("{email}"]
[HttpGet]
[ResponseType(typeof(LCPreview))]
public IHttpActionResult ValidateEmail(string email) { ... }
}
请注意,如果在末尾输入时没有斜杠 (/),电子邮件中的点 (.) 会给您带来一些问题。该框架会认为它正在寻找一个文件并出错。
如果打算发送电子邮件地址,则使用 POST 并在正文中包含电子邮件。
//POST api/PreviewLCAPI
[Route("")]
[HttpPost]
[ResponseType(typeof(LCPreview))]
public IHttpActionResult ValidateEmail([FromBody] string email) { ... }
在请求正文中发送它可以避免 url 中的电子邮件格式出现任何问题。
我有一个生成的 Entity Framework API 控制器,我现在正尝试向它添加一个新方法:
[ResponseType(typeof(LCPreview))]
public IHttpActionResult ValidateEmail(string email)
{
LCPreview lCPreview = db.Data.Find(5);
if (lCPreview == null)
{
return NotFound();
}
return Ok(lCPreview);
}
但是当我 运行 这个时,我得到这个错误:
The request is invalid. The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Http.IHttpActionResult GetLCPreview(Int32)' in 'Astoria.Controllers.PreviewLCAPIController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
通过基于约定的路由,路由 table 无法区分这两个操作,并且正在根据 Get
前缀约定选择 GetLCPreview
操作。
鉴于您的路由配置已经启用属性路由,这意味着可以使用参数约束来帮助区分路由。
[RoutePrefix("api/PreviewLCAPI")]
public class PreviewLCAPIController : ApiController {
//GET api/PreviewLCAPI/5 <- only when the value is an int will it match.
[Route("{id:int}")]
[HttpGet]
public IHttpActionResult GetLCPreview(int id) { ... }
//GET api/PreviewLCAPI/someone@email.com/
[Route("{email}"]
[HttpGet]
[ResponseType(typeof(LCPreview))]
public IHttpActionResult ValidateEmail(string email) { ... }
}
请注意,如果在末尾输入时没有斜杠 (/),电子邮件中的点 (.) 会给您带来一些问题。该框架会认为它正在寻找一个文件并出错。
如果打算发送电子邮件地址,则使用 POST 并在正文中包含电子邮件。
//POST api/PreviewLCAPI
[Route("")]
[HttpPost]
[ResponseType(typeof(LCPreview))]
public IHttpActionResult ValidateEmail([FromBody] string email) { ... }
在请求正文中发送它可以避免 url 中的电子邮件格式出现任何问题。