.net - 禁止 - visual studio ローカルiis




現在のアプリケーションがASP.NET Webアプリケーションかどうかを調べる方法 (3)

マネージクラスライブラリから、現在実行中のアプリケーションがASP.NET Webアプリケーション(WebフォームまたはMVC)であるかどうかを調べたいです。

たとえば、次のいずれかをチェックするなど、さまざまな方法でこれを実行できます。

  • System.Web.Hosting.HostingEnvironment.IsHosted == true
  • System.Web.HttpContext.Current != null
  • System.Web.HttpRuntime.AppDomainAppId != null
  • System.Web.HttpRuntime.Cache != null
  • web.configファイルをチェックする(注:これは信頼できるとは思わない)

問題は、どのアプローチを使うべきかということです。 それらの中には無効なもの(つまり、Windowsアプリケーションで実行してもtrueを返すものもあります)、またはそれらすべてが等しいものですか?

更新/説明 (私の質問が十分に明確でなかった場合は申し訳ありません):

  • 私は(明らかに).netアプリケーションによって実行されるマネージクラスライブラリ(.netコード)を持っています。
  • この「ホストアプリケーション」は、ASP.NETアプリケーション(WebフォームやMVCなど)またはWindowsアプリケーション(コンソールやWinフォームなど)のいずれかです。
  • 私の質問は 、ASP.NETアプリケーションの一部として実行されているかどうかを(実行時に)自分のクラスライブラリ内から確実に判断する方法があるかどうかです。

:私は私が別の解決策(例えば、下記のコメントやTomas Lyckenの答えを参照)を実装することができることを知っていますが、それはこの質問のポイントではありません。 クラスライブラリは既に存在しているので、できるだけ少ないコードに変更したいと思います。


ここであなたの目標に疑問を投げかける必要があります。なぜライブラリはそれがどんな種類のアプリケーションから実行されているのかを知っているべきなのでしょうか?

私にとっては、ライブラリの関連部分を2つの部分に分割する必要があるように思えます。1つはWebアプリケーション用、もう1つはwinformsアプリケーション用です。 (そしておそらく3番目の部分、両方のタイプのアプリで使用できるすべてのものを含む...)



潜在的に信頼できません。 MSDNは、新しいオブジェクトが存在しない場合は常に新しいオブジェクトを返すimpliesimpliesします。 したがって、それを呼び出すことができ、それが呼び出される前に存在しないことが技術的にあります。

    System.Web.Hosting.HostingEnvironment.IsHosted == true

すべてのWeb環境にはコンテキストが必要です。 そのコンテキスト内にあるハンドラは、Web環境の種類を示すものです。 (MvcHandlerなど) これは、同じ環境では異なる種類のハンドラになる可能性があることに注意してください。たとえば、MVCフォームとWebフォームを一緒に実行できます。 それは、現在何が提供されているのか、そしてそれが使用しているパイプライン次第です。

    System.Web.HttpContext.Current != null

すべてのWebアプリにはアプリケーションIDが必要です 。 これは一意であり、アプリケーションプールが再起動されても変わりません。

    System.Web.HttpRuntime.AppDomainAppId != null

論理的にはキャッシュが使用されず、したがって信頼性がない時間を想像することができますが、これを見たことはありません。

    System.Web.HttpRuntime.Cache != null

あなたが正しい。

web.configファイルをチェックする(注:これは信頼できるとは思わない)

私は図書館の中でこの種のものを使っています。 信頼できると思いました。

         Page page = (HttpContext.Current != null && HttpContext.Current.Handler != null) ? HttpContext.Current.Handler as Page : null;
         if (HttpRuntime.AppDomainAppId != null && page != null)
         {
            //I'm a web forms application
         }
         else if (HttpRuntime.AppDomainAppId != null && page == null && HttpContext.Current != null) { throw new InvalidOperationException("I'm an MVC application"); }
         else throw new InvalidOperationException("Im not ASP.Net web");




asp.net