我正在使用Angularjs和ASP.NET Web Api,我的$ http.get,$ http.put和$ http.delete工作正常,但是当我调用$ http.post时,我得到500内部服务器错误,这里是我的代码:
我的Angularjs控制器插入功能:
$scope.insert = function () {
var data = '{ "Id": "1", "Name": "test", "Category": "r", "Price": "456.00" }';
$http.post('api/products', data).success(function (data) {
alert("it works");
}).error(function () {
console.log(Error);
alert('Error reading JSON file. - ' + data);
});
}
我在C#中的模型:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
我在C#中的控制器:
public class ProductsController : ApiController
{
public void PostProduct(Product product)
{
if (product == null)
{
throw new ArgumentNullException("product is NULL");
}
try
{
con.Open();
SqlCommand cmd = new SqlCommand();
cmd = new SqlCommand("INSERT INTO [AdventureWorks2012].[Production].[Product2] ( [Name], [ListPrice], [ProductLine]) VALUES ('" + product.Name + "', '" + product.Price + "', '" + product.Category + "')", con);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
代码永远不会到达C#控制器中的制动点并引发500内部服务器错误。
请告知。
答案 0 :(得分:0)
如果你说的是真的并且代码执行永远不会到达PostProduct()
中的ProductsController
操作方法,那么问题必须早于Web API管道(例如任何全局消息处理程序,过滤器等)或与客户端。
通过使用Fiddler,Postman等向Web API发送相同的请求和数据,很容易从流程中消除客户端代码。我知道这是一个基本的建议,但是因为你如果您在问题中尝试了这一步骤,我不得不澄清,我不得不提及它。
如果请求在发送时正常工作,那么您的客户端代码就会出现问题。否则,您需要查看在请求被路由到控制器之前在服务器上执行的代码。
答案 1 :(得分:0)
这很可能是路由问题。第一步是找出您的路线是否设置正确。使用此工具调试路线:http://www.nuget.org/packages/routedebugger
e.g。您可能需要使用以下url api / products / PostProduct,具体取决于您的路由。另外,我会将[HttpPost]属性放在该操作方法之上。
如果路由正确,那么您的模型可能存在一些问题以及Json如何传递给您的操作,因此路由器无法匹配正确的操作方法。我建议你使用Fiddler检查Http请求和响应,看看确切的请求体是什么。
答案 2 :(得分:0)
更新:问题解决了!我已经在我的Chrome浏览器中添加了Postman扩展程序,因为djikay建议并发现它在ProductsController中看到POST方法并且混淆了哪一个要调用。
显然控制器应该只有GET,POST,PUT和DELETE方法,但我还包括另一种方法,我用GetProduct和GetAllProducts调用以避免冗余。但它看起来添加到控制器的任何其他方法都不是GET,POST,PUT或DELETE被视为POST。
我想我的WebForms工作时间很长,需要刷新我的MVC知识。
无论如何,这两个答案对我找到解决方案非常有帮助,我感谢djikay和Aidin。