イベント ハンドラ : エクスプローラ ビューを使用する際の注意点

みなさん。こんにちは kenmori です。

 

本日は、先日ご説明したイベントハンドラを使う際の注意点 (https://blogs.technet.com/sharepoint_support/archive/2009/10/26/3289128.aspx) のブログ記事について、特に 4. エクスプローラ ビューを使用する際の注意点について、お問い合わせでも多くのご質問をいただいておりますので追記させていただきます。

イベント ハンドラを使う際の注意点

4. エクスプローラ ビューを使用する際は要注意です。

 

先日、ドキュメントライブラリなどにイベント ハンドラを関連づけると、エクスプローラ ビューがサーバーに対して遅延書き込みを実施するために、イベントが重複発生することをご説明いたしました。

 

clip_image002

 

前回のおさらいもありますので、重複する部分も含めて記載いたします。

 

- 遅延書き込みの簡単なご説明

遅延書き込みを簡単にご説明しますと、例えばリムーバブル ディスクやネットワーク プレースへのファイル書き込みなど、処理時間がかかるファイル I/O 処理を非同期的に実行することにより、画面操作やファイル I/O 処理を最適化するための動作となります。

ファイル アップロードの動作においては、まずサーバー側でアップロード対象のファイル (この時点では 0 KB) を作成します。その後、サーバーに転送されてくるファイルのデータを一度メモリにバッファさせ、システム上適切なタイミングにて適時書き込み処理を実施していくことで、書き込み効率を最適化しております。

 

更新イベントは、SharePoint に対して書き込まれた回数呼び出されます。

例えば、遅延書き込みによってバックグラウンドのスレッドが 1 つのファイルを保存するにあたり 4 回書き込みを実施した場合、1 回の ItemAdded イベントと 3 回の ItemUpdated イベントが発生する動作となります。

 

この結果、イベントハンドラにてメールを送信するなどの処理を実施した場合は、不要なメールが飛び交うことが考えられます。SharePoint 側はエクスプローラ ビューより更新されてくるイベントを検知して処理を実施するだけですので、残念ながら SharePoint としてこの複数回発生する更新を変更することはできません。

 

対処策

メールの送信処理はできればワークフローで実装してください。

 

 ワークフローは多重起動できませんので処理が複数回実施されるのを避けることができます。前回ブログでお伝えした方法であり、これが最も効果的な方法と考えられます。

 もちろんワークフローも内部的にはイベントで起動されますので、瞬時に終わるワークフローを作成すると 2 回以上動作することも考えられます。

 その場合は、一番最後に待機処理を入れて、処理が瞬時に終わらないようにしましょう。

 

(SharePoint Designer ワークフローの場合)

clip_image004

 

(Visual Studio によるワークフローの場合)

clip_image006

 

その他の案

1. イベント ハンドラでロジックを作り込む (重複制御、およびリトライ処理)

『何とかイベント ハンドラを使用し、遅延書き込み処理が終わってから処理を実行できるようにしたい』といったご要望を多くいただくため追記させていただきます。

これについては完全な対策とは言い切れませんが、重複制御やリトライ処理を作り込むことで、何とか実装することも可能と思われます。

 

残念ながら、遅延書き込みを含む更新が完全が終わっていることを知るためのプロパティ値などは用意されておりません。従って、1 回のユーザー操作のうち現在のイベントが最後であるかどうかなどを認識することはできません。また、最後のイベントの処理中であっても、上述の注意点 1. にて記載いたしましたとおり、書き込み処理が完全に終わっているかどうかを認識する方法はございません。

 

イベントハンドラでどうしても処理を実現する場合は、以下のような処理を組み合わせて作り込んで回避するしか方法はなさそうですが、現実的には難しい対処策となります。

・データベースなどの外部データ ソースに実行済みフラグを保存して処理の重複を制御する。

(NLB 環境など複数の Web フロント エンド サーバーにおける同時アクセスを制御するために、メモリ上ではなく外部データを使用して制御します。)

・リトライ処理などを実装することで適切なタイミングに実行させるなどの作り込みが必要となります。

 

2. WebClient を使用しない

この方法を使用することで遅延書き込みを防ぎ、この事象を回避できるのではと思われる方もいらっしゃると思います。しかしながら、これらは長期的な視点においては、推奨する回避策ではございません。

・WebClient サービスを停止する。

・80 番ポート以外の Web アプリケーションを使用する。

 

たしかに、上記 2 つの方法にてイベントの重複を回避できる場合があることを認識しております。

クライアント OS に MSDAIPP と呼ばれるコンポーネントがインストールされている場合が前提となりますが、WebClient サービスが動作しない場合は、WebClient サービスの代わりに MSDAIPP が動作することでブラウザ上でエクスプローラ ビューを使用することができます。MSDAIPP には遅延書き込みの機能がないため、MSDAIPP が動作している場合には上述のイベント重複が発生しません。

 

MSDAIPP が動作する条件について例を記載いたします。

・Windows XP では WebClient サービスは 80 番ポートの Web サイトに対してのみ有効であるため、80 番ポート以外の Web アプリケーションに対しては MSDAIPP がエクスプローラ ビューにおける処理を実施します。

・クライアント OS 上で、[管理ツール] より [サービス] を開き、WebClient サービスを停止すれば、MSDAIPP が代わりに動作し、エクスプローラ ビューにおける処理を実施します。

 

上述のように遅延書き込みを回避するために MSDAIPP を使用するよう設定する方法は、一見有効な回避策と思えます。

しかし、Windows Vista 以降においては WebClient サービスの使用が推奨され、今後の主流となっていくことが予想されております。

クライアント OS のアップグレードも含めた長期的な視野で考えた場合、WebClient サービスを使用しないという回避策は、今後問題を引き起こす要因となることが懸念されますのでご注意ください。

 

なお、上記にてご説明した WebClient サービスや MSDAIPP の詳細につきましては本投稿では割愛させていただきます。より詳細な情報については、別の担当者が別途ブログを記載することを予定しております。お楽しみに。