0

Я пытаюсь создать приложение для Windows Store с помощью контроллера WebApi Odata. После некоторого усилия у меня все рабочие запросы Get, теперь я перехожу к методам CRUD и получаю следующее исключение в EndSaveChanges контекста службы данных.WebApi Odata Windows Store App EndSaveChanges exception

<?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> 

Теперь я думаю, что это ошибка в WebAPI от этого http://aspnetwebstack.codeplex.com/workitem/822 и его сокрытия фактической ошибки. Чтобы убедиться, что это не моя конечная точка Одата, я создал быстрое консольное приложение, чтобы получить запись, обновить ее и исправить ее, что сработало нормально. Мой контроллер WebApi Odata происходит от ODataController с
public HttpResponseMessage Patch([FromODataUri] Guid key, Delta<ESFClient> patch) Как метод. В моем приложении Windows у меня есть метод расширения в DataServiceContext для сохранения изменений.

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; 
     } 

И вызывать обновление так же, как на чистой странице Windows Store XAML.

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. 
      }   
     } 

Так кто-нибудь сталкивается с той же проблемой или знает, как я могу узнать фактическую ошибку. Интересным моментом является то, что если я отлаживаю контроллер во время работы приложения Windows, метод patch не будет вызван.

+0

Я не уверен, что вызывает вашу ошибку, но ваш метод расширения [можно упростить] (http://pastebin.com/iJa2ksY0). –

ответ

0

Итак, я, наконец, решил это. Просто резюме для тех, кто может испытать ту же проблему. У меня есть контроллер Odata WebApi, приложение для хранения Windows 8 с использованием клиентской библиотеки WCF, с ссылкой, созданной из Add Service Reference. При попытке обновления (исправления) записи в EndSaveChanges было выбрано исключение. Это связано с тем, что по какой-то причине Post Tunneling включен по умолчанию в моем контексте. Установка этого параметра в false позволяет все работать.

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

 Смежные вопросы

  • Нет связанных вопросов^_^