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 エンドポイントではないことを確認するために、エントリを取得して更新し、パッチを適用して元に戻すクイック コンソール アプリを作成しました。これはすべて正常に機能しました。My 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 ストア 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.
            }           
        }

誰かが同じ問題に遭遇したり、実際のエラーを見つける方法を知っていますか. 興味深い点の 1 つは、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 に答える