【问题标题】:ASP.NET Entity Framework API Controller Add method not workingASP.NET 实体框架 API 控制器添加方法不起作用
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多