2017-09-26 1 views
2

Je suis un cours Pluralsight sur AngularJS et WebAPI ensemble. J'essaie d'enregistrer les données envoyées du client au serveur en utilisant PUT, mais les données ne sont pas enregistrées et je ne reçois aucune erreur. En outre, il n'atteint pas le code côté serveur correct car les points d'arrêt ne sont pas interceptés. J'ai essayé de changer le type de méthode HTTP, mais j'ai besoin de celui-ci. La seule chose renvoyée est un code "204: No Content" du serveur.Les données JSON ne sont pas enregistrées dans WebAPI

Voici à quoi ressemblent les méthodes PUT et POST. Les points d'arrêt dans l'une de ces méthodes ne seront pas capturés.

// POST: api/Products 
public void Post([FromBody]Product product) // Creating a product 
{ 
    var productRepository = new ProductRepository(); 
    var newProduct = productRepository.Save(product); 
} 
// PUT: api/Products/5 
public void Put(int id, [FromBody]Product product) // Updating a product 
{ 
    var productRepository = new ProductRepository(); 
    var updatedProduct = productRepository.Save(id, product); 
} 

ProductRepository ressemble à ceci:

internal Product Save(Product product) 
{ 
    // Read in the existing products 
    var products = this.Retrieve(); 
    // Assign a new Id 
    var maxId = products.Max(p => p.ProductID); 

    product.ProductID = maxId + 1; 
    products.Add(product); 

    WriteData(products); 

    return product; 
} 

internal Product Save(int id, Product product) 
{ 
    // Read in the existing products 
    var products = this.Retrieve(); 

    // Locate and replace the item 
    var itemIndex = products.FindIndex(p => p.ProductID == product.ProductID); 
    if (itemIndex > 0) 
    { 
     products[itemIndex] = product; 
    } 
    else 
    { 
     return null; 
    } 

    WriteData(products); 
    return product; 
} 

Ceci est la partie principale du contrôleur qui est utilisé (en utilisant Controller-As syntax:

var vm = this; 
vm.submit = function() { 
    vm.message = ""; 
    if (vm.product.productID) { 
     vm.product.$update({ id: vm.product.productID }, function (data { 
      console.log(data); 
      vm.message = "Save Complete"; 
     }); 
    } else { 
     vm.product.$save(function (data) { 
      vm.originalProduct = angular.copy(data); 
      vm.message = "Save Complete"; 
     }); 
    } 
}; 

Enfin, productResource est un service personnalisé ressemble à ceci:

var productResource = function($resource, appSettings) { 
    return $resource(appSettings.serverPath + "/api/Products/:id", null, { 
     'update': { method: 'PUT' } 
    }); 
} 

J'ai essayé de voir si c'est un problème CORS, mais ce n'est pas le cas depuis que je l'ai activé au niveau de la classe.

+0

Votre message et mettre les méthodes de l'API Web ne semblent pas pour retourner n'importe quoi. Je pense qu'ils devraient retourner une réponse? –

+0

@ChrisNevill Le '204: No Content' est la réponse par défaut je suppose, mais ils n'ont pas besoin de retourner une réponse personnalisée afin de sauvegarder les données. Quel est le problème? – JustinJmnz

+0

Étrange les débogueurs ne pas atteindre vos points d'arrêt. Vous êtes sûr que les clients se connectent au bon serveur, pas IIS lorsque vous déboguez dans IIS Express ou quelque chose comme ça? J'utilise des points d'arrêt avec l'API Web tout le temps et ils fonctionnent. –

Répondre

1

S'il vous plaît vérifier votre API si elle met en œuvre CORS (Cross Origin Resource Sharing)

+0

C'est activé au niveau de la classe. – JustinJmnz

1

Ne devrait pas

var itemIndex = products.FindIndex(p => p.ProductID == product.ProductID); 

être

var itemIndex = products.FindIndex(p => p.ProductID == id); 
+0

Vous avez raison, mais cela ne résout pas le problème. – JustinJmnz

+0

Qu'en est-il de votre acheminement dans 'global.asax.cs', pouvez-vous le montrer? Puisque vous dites que le code n'atteint même pas le point de rupture. – Shiva