REST API HttpPost使我失败

时间:2019-03-03 17:26:12

标签: c# visual-studio rest iis http-post

我正在开发REST API,尝试通过HTTP-POST访问时遇到问题。

在我的项目中,“ ApiAreaRegistration”中的定义如下:

context.MapRoute(
            "AccesoRegistro",
            "Api/Registros/Registro/{email}/{fecha}", 
            new
            {
                controller = "Registros", 
                action = "Registro", 
                email = UrlParameter.Optional,
                fecha = UrlParameter.Optional
            }
        );

“电子邮件”和“ fecha”是可选参数。

在mi“ RegistroController”中,我定义了:

 public JsonResult Registro(int? id, Registro reg)
{
    switch (Request.HttpMethod)
    {
        case "POST": 
            return Json(registroManager.InsertarRegistroComidas(reg));
        case "GET": 
            return Json(registroManager.ObtenerRegistros(reg.email, reg.fecha),
                JsonRequestBehavior.AllowGet);
    }
    return Json(new { Error = true, Message = "Operación HTTP desconocida" });
}

我只想执行POST和GET方法。我正在使用名为“ RESTED”的firefox插件进行测试,当我使用HTTP-GET时,它工作正常。我访问 通过使用http://localhost:puerto/Api/Registros/registro/email/12-12-2000的Get Method到REST。 REST向我返回了期望值。

如果我尝试执行http://localhost:puerto/Api/Registros/registro(没有可选参数)的HTTP-POST,则服务器向我返回404错误:“找不到资源”。 我在switch()语句的Controller方法内设置了一个断点,当我尝试使用HTTP-POST访问时,永远不要执行此方法。

public JsonResult Registro(int? id, Registro reg)
{
    switch (Request.HttpMethod) <-- Here i set the breakpoint
    {
        case "POST": 
            return Json(registroManager.InsertarRegistroComidas(reg));
        case "GET": 
            return Json(registroManager.ObtenerRegistros(reg.email, reg.fecha),
                JsonRequestBehavior.AllowGet);
    }
    return Json(new { Error = true, Message = "Operación HTTP desconocida" });
}

我尝试通过定义如下方法来设置[HttpPost]:

 [HttpPost]
    public JsonResult InsertarRegistro(Registro reg)
    {
              return Json(registroManager.InsertarRegistroComidas(reg));
    }

我在ApiAreaRegistration中定义了这种方式:

context.MapRoute(
        "AccesoInsertarRegistro",
        "Api/InsertarUnRegistro",
        new
        {
            controller = "Registros",
            action = "InsertarRegistro",
        }
    );

在RESTED中,如果我使用http://server:port/api/insertarunregistro和我需要的所有参数来进行HTTP-POST,则将执行方法“ InsertarRegistro”,但“ Registro reg”的参数为null,则我有5个属性类,并且全部为空。

一种方法返回404,另一种方法返回空参数...我该怎么办?我在做什么错了?

1 个答案:

答案 0 :(得分:0)

  

如果我尝试执行http://localhost:puerto/Api/Registros/registro(没有可选参数)的HTTP-POST,则服务器向我返回404错误:“找不到资源”。我在switch()语句的Controller方法内设置了一个断点,当我尝试使用HTTP-POST访问时,永远不要执行此方法。

我猜您的应用程序中有两个url重写规则,一个是AccesoRegistro规则,另一个是Default规则。

默认规则如下:

        routes.MapRoute(
         name: "Default",
         url: "{controller}/{action}/{id}",
         defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );

因此,http://localhost:puerto/Api/Registros/registro首先将匹配默认规则“ {controller} / {action} / {id}”而不是AccesoRegistro规则,它将返回404错误。

我建议您可以将AccesoRegistro规则放在“默认”规则之前,这样就可以正常工作。

像下面这样:

    routes.MapRoute(
     name: "Default",
     url: "{controller}/{action}/{id}",
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
 );

    routes.MapRoute(
"AccesoRegistro",
"Api/Registros/Registro/{email}/{fecha}",
new
{
    controller = "Registros",
    action = "Registro",
    email = UrlParameter.Optional,
    fecha = UrlParameter.Optional
}

结果:

enter image description here