9

DataServiceContextプロキシ経由でOData Webservice () を呼び出す Web アプリがあります。問題は、コードが毎回 OData Web サービスを呼び出しても、コンテンツ管理システム (SDL Tridion) でコンテンツを変更した後、常に古いデータを返すことです。

string getPageContentForUrl(string url)
{
    var page = cdService
                   .Pages
                   .Expand("PageContent")
                   .Where(x => x.Url == url)
                   .FirstOrDefault();

    if (page == null || page.PageContent == null)
    {
        return string.Empty;
    }
    else
    {
        return page.PageContent.Content;
    }

}

最新のデータ変更を確認するには、apppool をリセットする必要がありました。

それで、さらにデバッグしているときに、私はそれに気づきました

var context = (System.Data.Services.Client.DataServiceContext)cdService;
context.Entities[0].State = Unchanged

.Detach()から値を返す前に明示的に呼び出して修正しようとしたgetPageContentForUrlので、

cdService.Detach(page);
cdService.Detach(page.PageContent);

私の質問は、より「グローバル」レベルで上記を実行できますか?コードを手動で書きたくないので、Web サービスに状態を常に「変更済み」と見なさせることができますDetach()か?

4

2 に答える 2

10

答えは確かに-あなたが疑ったように-あなたが使用しているプロキシ、あるいはむしろDataServiceContextにあると思います。これはマイクロソフトが言わなければならないことです:

デフォルトでは、クライアントは、DataServiceContextによってまだ追跡されていないエンティティのオブジェクトへの応答フィードのエントリのみを実体化します。これは、すでにキャッシュにあるオブジェクトへの変更が上書きされないことを意味します。この動作は、クエリとロード操作にMergeOption値を指定することで制御されます。

私には、これはあなたが説明している振る舞いとまったく同じように聞こえます。幸い、DataServiceContextのMergeOptionプロパティを設定することで、キャッシュをオフにすることができます。

http://msdn.microsoft.com/en-us/library/gg602811.aspxを参照してください。

于 2012-11-09T10:57:07.057 に答える
5

Quirijn が既にコメントしているように、Tridion コンテンツ配信 OData サービスがキャッシュされた結果をセットアップで返しているようです。クライアントを切り離して再接続することは、総当りの回避策です。

Tridion Content Delivery Object Cache は、(適切に構成されている場合) コンテンツ管理システムからの発行アクションによってアイテムが更新されると、キャッシュからアイテムを自動的に削除します。これはセットアップでは発生しないため、Object Cache が正しく構成されていない可能性があります。

最も簡単な手順は、cd_webservice Web アプリケーションの cd_storage_conf.xml ファイルを見つけて、オブジェクト キャッシュをオフにすることです (Quirijn が既に述べたように)。

<ObjectCache Enable="false" />

ここで、前と同じようにアプリケーション プールをリサイクルして、もう一度テストします。OData 呼び出しが常に更新されたコンテンツを返すようになった場合、問題は実際にはオブジェクト キャッシュの構成ミスが原因でした。

残念ながら、この段階ではオブジェクト キャッシュをオフにするだけで済みます。これにより、Web サービスが処理できる負荷が確実に減少します。次のステップは、オブジェクト キャッシュの構成の問題を修正することです。

そのためには、SDL プロフェッショナル サービスまたは SDL のパートナーに連絡することをお勧めします。Object Cache の構成はそれほど難しくありませんが、Q&A 形式で説明するには少し複雑すぎます。

于 2012-11-08T18:51:29.077 に答える