0

我正在尝试使用 WebApi Odata 控制器创建 Windows 应用商店应用程序。经过一番努力,我的所有 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>

现在我认为这是来自http://aspnetwebstack.codeplex.com/workitem/822的 WebApi 中的一个错误,它隐藏了实际错误。为了确保它不是我的 Odata 端点,我创建了一个快速控制台应用程序来获取条目、更新它并修补它,一切正常。我的 WebApi Odata Controller 使用
public HttpResponseMessage Patch([FromODataUri] Guid key, Delta<ESFClient> patch) As 方法从 ODataController 派生。在我的 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 应用程序时调试控制器,补丁方法不会被调用。

4

1 回答 1

0

好的,所以我终于解决了这个问题。只是对那些可能遇到同样问题的人的回顾。我有一个 Odata WebApi 控制器,使用 WCF 客户端库的 Windows 8 应用商店应用程序,其引用是从添加服务引用创建的。当尝试更新(修补)记录时,EndSaveChanges 中引发了异常。这是因为出于某种原因,默认情况下在我的上下文中启用了 Post Tunneling。将此设置为 false 允许一切正常工作。

Context.UsePostTunneling = false;
Context.IgnoreResourceNotFoundException = true;
于 2013-06-06T08:32:37.710 回答