Angularjs et ASP.NET l'Api Web de provoquer 500 Erreur Interne du Serveur sur $http.post
Je suis en utilisant Angularjs et ASP.NET l'Api Web, mon $http.get, $http.mettre et $http.supprimer fonctionnent très bien, mais quand je l'appelle $http.post-je obtenir 500 Erreur Interne du Serveur, voici mon code:
Mon Angularjs Contrôleur insérer une fonction:
$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);
});
}
Mon modèle en C#:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
Mon contrôleur en 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);
}
}
}
Code n'atteint jamais le frein de points en C# contrôleur et la lance 500 Erreur Interne du Serveur.
Veuillez en informer.
- Veuillez fournir l'itinéraire de configuration.
Vous devez vous connecter pour publier un commentaire.
Si ce que vous dites est vrai et l'exécution de code n'atteigne votre
PostProduct()
méthode d'action dans votreProductsController
, alors le problème doit être plus haut dans le pipeline API Web (par exemple, à l'échelle mondiale les gestionnaires de messages, filtres, etc.) ou avec le client.Il est facile d'éliminer le code client de la démarche par le tir à la même demande et les données de votre API Web à l'aide de Fiddler, Facteur, etc. Je sais que c'est une chose à suggérer, mais puisque vous n'avez pas de préciser si vous avez essayé cette étape ou pas dans votre question, j'ai eu à le mentionner.
Si la requête fonctionne correctement lorsqu'il est envoyé comme ça, alors c'est un problème avec votre code client. Sinon, vous avez besoin de prendre un coup d'oeil au code qui est exécuté sur votre serveur avant de faire votre demande sera acheminée à votre contrôleur.
C'est probablement un problème de routage. La première étape est de savoir si vos routes sont configurés correctement. Utilisez cet outil pour le débogage de votre parcours: http://www.nuget.org/packages/routedebugger
par exemple, vous pourriez avoir besoin d'utiliser l'url suivante api/produits/PostProduct en fonction de votre routage. Aussi je voudrais mettre un [HttpPost] attribut ci-dessus que la méthode d'action.
Si le routage est correcte, alors il pourrait y avoir certains problèmes avec votre modèle et comment le Json est passé à votre action, d'où le routeur cant choisir la bonne méthode d'action. Je vous recommande d'utiliser un violon pour inspecter la demande et la réponse Http et de voir quelle est l'exacte du corps de la requête.
Mise à JOUR: Problème résolu! J'ai ajouté un Facteur d'extension de mon navigateur google Chrome comme djikay l'a proposé et a découvert qu'il voit à POSTER des méthodes de contrôleur produits et confus qui l'un à l'appel.
Apparemment, les contrôleurs ne doivent avoir GET, POST, PUT et DELETE méthodes, mais j'ai inclus une autre méthode que j'ai appelé par GetProduct et GetAllProducts pour éviter la redondance. Mais il a l'air tout autres méthodes ajoutées au contrôleur qui n'est pas GET, POST, PUT ou DELETE sont considérés comme POST.
Je suppose que je travaillais avec les Formulaires web pour longtemps et la nécessité d'actualiser mon MVC connaissances.
En tout cas, les deux réponses ont été très utile pour moi de trouver la solution et je vous remercie à la fois djikay et Aidin.
[Http...]
attribut à votre méthode et votre nom de méthode n'a pas suivi le Web API convention de nommage, il est alors considéré commePOST
(j'ai eu une question similaire).