Исключение EndSaveChanges приложения Магазина Windows WebApi Odata

Я пытаюсь создать приложение для Магазина Windows с помощью контроллера WebApi Odata. После некоторых усилий у меня работают все запросы Get, теперь я перехожу к методам CRUD и получаю следующее исключение для 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>

Теперь я думаю, что это ошибка в WebApi из этого http://aspnetwebstack.codeplex.com/workitem/822 и скрывающая фактическую ошибку. Чтобы убедиться, что это не моя конечная точка Odata, я создал быстрое консольное приложение для получения записи, ее обновления и исправления, и все работало нормально. Мой Контроллер Одатаны WebApi происходит от 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;
        }

И так называемое обновление с пустой страницы XAML Магазина Windows.

 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, метод исправления не вызывается.

1 ответ

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

Context.UsePostTunneling = false;
Context.IgnoreResourceNotFoundException = true;
Другие вопросы по тегам