ここには多くの説明がありますが、必要です。
これを知っている人の数はわかりませんが、Visual Studio の Razor コード エディターにより、イベントの直前まで Web サイトが「テスト起動」されますApplication_Start
。これにより、現在のプロジェクトで厄介な問題が発生しています。多くのサイト初期化を行うための WebActivator。
更新 - よく調べてみると、Razor だけではなく、Visual Studio 全体のように見えるため、タイトルが変更されました
Web サーバーではなく、Visual Studio によって Web サイト コードが実行されていることを検出できる必要があります。
実証するには、次のことを行います (確実に再現するために書かれているとおりに正確に):
- 新しい MVC 4 サイトを作成します。インターネット アプリケーション テンプレートを使用したため、作成時にいくつかのページがありました。
- Nuget から WebActivator パッケージを追加します。
- という名前の App_Start フォルダーにクラスを追加します。
RazorPageBugTest
- このコードを貼り付けます (関連する名前空間を変更します):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcApplication6.App_Start;
using System.IO;
[assembly: WebActivator.PreApplicationStartMethod(
typeof(RazorPageBugTest), "Start", Order = 0)]
namespace MvcApplication6.App_Start
{
public static class RazorPageBugTest
{
public static void Start()
{
using (var writer = File.Open(@"c:\trace.txt", FileMode.Create))
{
using (var tw = new StreamWriter(writer))
{
tw.AutoFlush = true;
tw.WriteLine("Written at {0}", DateTime.Now);
}
}
}
}
}
このコードは、ドライブ C: に書き込みを行っていることを考えると、通常は Web サーバーで機能するものではないことに注意してください (実際、管理者として VS を実行しない場合、これはマシンで機能しない可能性があります)。
- プロジェクトをビルドします。
- この次のビットは、C で既にエクスプローラーを開いている場合に最適です。それが完了したら、Razor ビューを見つけて開きます。
- すべての C#/VB ビットが強調表示されるまで待ちます
- ドライブ C を見てください。「trace.txt」というファイルがあり、日付は最後の数秒以内です。
ここで問題を示します。Razor コード エディターは AppDomain を起動し、事実上、インテリセンスを取得するために Web サイトをシェル化しています (App_Helpers フォルダー内のものなどを含む)。現在、実際にはApplication_Start
メソッドをトリガーしませんが、プロジェクトに WebActivator もある場合、アプリケーション開始前のメソッドのいずれかがトリガーされます。
私の場合、これは大きな問題を引き起こしてdevenv.exe
います-DIコンテナを初期化し、この時点で他に何があるかを神が知っているため、CPU使用率とメモリ使用率が高くなります(ウェブサイトが開始されたばかりに相当します)が、特に1つは本当に迷惑です。
私の Web サイトには、Web ファーム内の他のマシンからのステータス メッセージとキャッシュ無効化メッセージをネットワークでリッスンするコンポーネントがあります。QA およびライブ環境では、このリスナーはポートを開いてリッスンすることに失敗することはありませんが、私の開発マシンでは、ポートが既に使用されていると言って頻繁に失敗します。それを開いたままにしているプロセスを探すと、それは常にdevenv.exe
.
ご想像のとおり、WebActivator で初期化されたブートストラップ呼び出しでこのリスナーを開始します。
問題は、コードが「適切な」Webホストによって実行されていないことを検出して、コードの実行を停止できる方法を知っている人はいますか? 結果として、Visual Studio と Razor の編集エクスペリエンスが非常に高速になることも意味するため、これには特に期待しています!
おまけとして、修正は WebActivator の作成者である David Ebbo に合法的に送信できるため、問題を完全に防ぐためにスタックの早い段階でそれを貼り付けることができます。
アップデート
GitHub の WebActivator ページに問題を追加して、David Ebbo が私の修正またはより良い修正を WebActivator コンポーネントにプッシュできるかどうかを確認しました。