我正在开发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,另一种方法返回空参数...我该怎么办?我在做什么错了?
答案 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
}
结果: