0

我正在嘗試使用WebApi Odata控制器創建Windows應用商店應用。經過一番努力後,我的所有Get請求都起作用了,現在我正在轉向CRUD方法,並且在數據服務上下文的EndSaveChanges上獲得以下異常。WebApi Odata Windows應用商店應用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控制器派生自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應用商店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應用程序時調試控制器,則修補程序方法不會被調用。

+0

我不確定是什麼原因導致你的錯誤,但你的擴展方法[可以簡化](http://pastebin.com/iJa2ksY0)。 –

回答

0

好的,所以我終於解決了這個問題。對於那些可能遇到同樣問題的人來說只是一個回顧。我有一個Odata WebApi控制器,使用WCF客戶端庫的Windows 8 Store應用程序,以及從添加服務引用創建的引用。當試圖更新(修補)記錄時,EndSaveChanges正在拋出異常。這是因爲由於某種原因,我的上下文中默認啓用了Post Tunneling。將它設置爲false可以讓所有的東西都起作用

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