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

时间:2016-11-10 19:20:12

标签: c# asp.net-mvc entity-framework asp.net-web-api asp.net-web-api-routing

我有一个生成的实体框架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 }
    );
}

1 个答案:

答案 0 :(得分:1)

通过基于约定的路由,路由表无法区分这两个操作,并且正在根据GetLCPreview前缀约定选择Get操作。

鉴于您的路由配置已启用属性路由,这意味着可以使用参数约束来帮助区分路由。

[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) { ... }

在请求正文中发送它可以避免网址中的电子邮件格式出现任何问题。