ASP.. NET实体框架API控制器添加方法不工作

本文关键字:添加 方法 工作 控制器 API NET 实体 框架 ASP | 更新日期: 2023-09-27 18:17:16

我有一个生成的实体框架API控制器,我现在正试图添加一个新方法:

[ResponseType(typeof(LCPreview))]
public IHttpActionResult ValidateEmail(string email)
{
    LCPreview lCPreview = db.Data.Find(5);
    if (lCPreview == null)
    {
        return NotFound();
    }
    return Ok(lCPreview);
}

但是当我运行这个时,我得到这个错误:

请求无效。参数字典包含一个非空类型'System '的参数'id'的空条目。Int32' for方法'System.Web.Http.IHttpActionResult GetLCPreview(Int32)' in 'Astoria.Controllers.PreviewLCAPIController'。可选形参必须是引用类型、可空类型,或者声明为可选形参。

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

ASP.. NET实体框架API控制器添加方法不工作

通过基于约定的路由路由表无法区分这两个动作,并根据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中电子邮件格式的任何问题。