ASP.NET Web アプリケーションでフォーム認証を使用し、特定のフォームで FileSystemWatcher を使用しています。フォームの機能は次のとおりです。
1. ユーザーがアプリケーションにログインします。
2. アプリケーションは、追加された新しいファイル (XML) がないかフォルダをスキャンし続ける必要があります。フォルダへのパスはデータベースから読み取られます。
3. フォルダに新しいファイルが作成されると、アプリケーションは XML ファイルから関連データを読み取り、そのファイルに関する情報をフォームに表示します。
この機能を実現するために関連するコントロールを検索した後、FileSystemWatcher に行きました。それが Web アプリケーションでどれほど効果的かはよくわかりません。ASP.NET Web アプリケーションで FileSystemWatcher に代わるものを提案できる人はいますか?
5 に答える
なぜ物事を過度に複雑にするのですか?最後にポーリングされた日付を保存し、最後にポーリングされた日付より後の変更日を持つファイルを取得します。FileSystemWatcher には、その使用に関するいくつかの注意事項があり、実際には必要ありません。
DirectoryInfo と少しの Linq を使用すると、次のようになります。
public static string[] GetNewFiles(string directory, string searchPattern, DateTime since)
{
// Create a new DirectoryInfo object.
DirectoryInfo dir = new DirectoryInfo(directory);
if (!dir.Exists)
{
throw new DirectoryNotFoundException("The directory does not exist.");
}
// Call the GetFileSystemInfos method.
FileSystemInfo[] infos = dir.GetFileSystemInfos(searchPattern);
string[] newXmlFiles = (from info in infos
where info.CreationTime > since
select info.FullName).ToArray();
return newXmlFiles;
}
public static string[] GetNewOrUpdatedFiles(string directory, string searchPattern, DateTime since)
{
// Create a new DirectoryInfo object.
DirectoryInfo dir = new DirectoryInfo(directory);
if (!dir.Exists)
{
throw new DirectoryNotFoundException("The directory does not exist.");
}
// Call the GetFileSystemInfos method.
FileSystemInfo[] infos = dir.GetFileSystemInfos(searchPattern);
string[] newXmlFiles = (from info in infos
where info.LastWriteTime > since
select info.FullName).ToArray();
return newXmlFiles;
}
public static string[] GetUpdatedFiles(string directory, string searchPattern, DateTime since)
{
// Create a new DirectoryInfo object.
DirectoryInfo dir = new DirectoryInfo(directory);
if (!dir.Exists)
{
throw new DirectoryNotFoundException("The directory does not exist.");
}
// Call the GetFileSystemInfos method.
FileSystemInfo[] infos = dir.GetFileSystemInfos(searchPattern);
string[] newXmlFiles = (from info in infos
where info.LastWriteTime > info.CreationTime && info.LastWriteTime > since
select info.FullName).ToArray();
return newXmlFiles;
}
はFileSystemWatcher
適切なクラスですが、フォームから使用するのは正しい方法ではありません。代わりに、ASP.NET アプリケーション (あまり望ましくない) または別の Windows サービス (より望ましい) でバックグラウンド ワーカーを作成してみてください。そうすれば、フォームは適切なメカニズムを使用してそのワーカーと通信します。次に、ワーカーはフォルダーをスキャンしてデータを読み取り、フォームで使用できるようにします。そのメカニズムは、ASP.NET アプリのワーカー スレッドの場合は一連のイベントと共有変数、または Windows サービスの WCF 名前付きパイプ チャネルです。
リアルタイム通知を作成する場合は、2つのコンポーネントを開発する必要があります。FileSystemWatcherを使用して新しいイベントをWeb側からチェックするサービスではなく、SignaIRを使用してリアルタイムのマルチユーザーインタラクティブWebアプリケーションを構築する必要があります。
これを見てください:
この記事では、FileSystemWatcherをWebアプリケーション内で使用する方法を示し、次にASP.NET固有の代替手段を提供するキャッシュメカニズムについて説明します。
に相当する ASP.NET を知りませんFileSystemWatcher
。
ただし、Begin_Request
イベントを Global.asax に追加して、要求ごとに新しいファイルを確認することができます。