Angularjs和ASP.NET Web Api导致$ http.post上出现500内部服务器错误

时间:2014-07-23 18:59:08

标签: c# asp.net angularjs asp.net-web-api

我正在使用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内部服务器错误。

请告知。

3 个答案:

答案 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。