0

J'essaie de créer une application Windows Store à l'aide d'un contrôleur WebApi Odata. Après quelques efforts, j'ai toutes les demandes Get fonctionnant, je passe maintenant sur les méthodes CRUD, et je reçois l'exception suivante sur les EndSaveChanges du contexte de service de données.WebApi Odata Windows Store App Exception EndSaveChanges

<?xml version="1.0" encoding="utf-8"?> 
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 
    <m:code /> 
    <m:message xml:lang="en-US">No HTTP resource was found that matches the request URI 'http://localhost:56317/odata/ESFClients(guid'f04ad636-f896-4de4-816c-388106cd39ce')'.</m:message> 
    <m:innererror> 
    <m:message>No routing convention was found to select an action for the OData path with template '~/entityset/key'.</m:message> 
    <m:type></m:type> 
    <m:stacktrace></m:stacktrace> 
    </m:innererror> 
</m:error> 

Maintenant, je pense que ce bogue dans WebAPI de ce http://aspnetwebstack.codeplex.com/workitem/822 et son cache l'erreur réelle. Pour m'assurer que ce n'était pas mon Odata Endpoint, j'ai créé une application de console rapide pour obtenir une entrée, la mettre à jour et la corriger, ce qui a bien fonctionné. Mon contrôleur WebApi Odata dérive de ODataController avec
public HttpResponseMessage Patch([FromODataUri] Guid key, Delta<ESFClient> patch) Comme méthode. Dans mon application Windows, j'ai une méthode d'extension sur le DataServiceContext pour enregistrer les modifications.

public static async Task<DataServiceResponse> SaveChangesAsync(this DataServiceContext context, SaveChangesOptions options) 
     { 
      var queryTask = Task.Factory.FromAsync<DataServiceResponse>(context.BeginSaveChanges(options, null, null), 
        queryAsyncResult => 
        { 
         var results = context.EndSaveChanges(queryAsyncResult); 
         return results; 
        }); 

      return await queryTask; 
     } 

Appelez la mise à jour comme telle à partir d'une page Windows Store XAML vierge.

public async Task UpdateWeekNo() 
     { 
      var container = new ESFOdataService.Container(new Uri("http://localhost:56317/odata/")); 
      var clients = (DataServiceQuery<ESFClient>)from p in container.ESFClients where p.UserID == new Guid("f04ad636-f896-4de4-816c-388106cd39ce") select p; 
      var result = await clients.ExecuteAsync(); 
      var updatedClient = result.Single(); 
      if (updatedClient != null) 
      { 
       updatedClient.WeekNo = 19; 
       container.UpdateObject(updatedClient); 
       await container.SaveChangesAsync(SaveChangesOptions.PatchOnUpdate); // Use PATCH not MERGE. 
      }   
     } 

Donc, est-ce que quelqu'un rencontre le même problème, ou sait comment je peux trouver l'erreur réelle. Un point intéressant est que si je débogue le contrôleur lors de l'exécution de l'application Windows, la méthode patch ne sera pas appelée.

+0

Je ne suis pas sûr de la cause de votre erreur, mais votre méthode d'extension [peut être simplifiée] (http://pastebin.com/iJa2ksY0). –

Répondre

0

Ok, donc j'ai finalement résolu ceci. Juste un récapitulatif pour ceux qui pourraient éprouver le même problème. J'ai un contrôleur Odata WebApi, Windows 8 Store Application à l'aide de la bibliothèque client WCF, avec la référence créée à partir de l'ajout de référence de service. Lors de la tentative de mise à jour (correction) d'un enregistrement, une exception était lancée sur EndSaveChanges. En effet, pour une raison quelconque, Post Tunneling est activé par défaut sur mon contexte. Mettre ceci à false a permis à tout de fonctionner.

Context.UsePostTunneling = false; 
Context.IgnoreResourceNotFoundException = true;