0

IISでホストされているWebサービスを構築していて、正常に起動する前にライセンスファイルがファイルシステム上にある必要があるという状況があります。Webサイトが実際に起動しないように、ライセンスチェックを行うコードをどこに配置すればよいのでしょうか。

Application_Start関数があることがわかりましたが、誰かが最初のリクエストを行うまでこれは呼び出されません。

理想的には、IIS管理者がWebサイト自体を起動しようとすると、アプリはライセンスを確認し、Windowsイベントログにエラーを記録します。これは可能ですか?そうでない場合、このタイプの状況に対するベストプラクティスはありますか?

4

1 に答える 1

4

登録されていないコンポーネントを使用しているWebサイトの一部が非常に悪い形式 であるため、Webサイト全体を爆撃します。

そのために、クラスの静的コンストラクターに何かを入れて、ライセンスをチェックし、ライセンス要件が見つからない場合は例外をスローすることができます。

public static MyComponent
{
    static MyComponent()
    {
         // Check for licensing here.
         if (!<licensing condition>)
         {
             // Bomb the app.
             throw new InvalidOperationException("Component is not licensed.");
         }
    }
}

Webサイト全体を爆撃したい場合は、ASP.NETの外部でこれを実行し、ISAPIフィルターを記述して(管理されていないコードで実行する必要があることに注意してください)、インストールする必要があります。 IISサーバー。

または、IHttpModuleインターフェイスを実装することもできます。Initメソッドの実装では、ライセンス要件を確認できます。要件が設定されていない場合は、次のように例外をスローします。

public class MyLicensingHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
         // Check for licensing here.
         if (!<licensing condition>)
         {
             // Bomb the app.
             throw new InvalidOperationException("Component is not licensed.");
         }            
    }
}

(まだ実装を登録するIHttpModule必要があることに注意してください)

より良い解決策は実装することですが、ライブラリ/コンポーネントが必要に応じてIHttpModuleアクセスできるフラグを設定します。

public class MyLicensingHttpModule : IHttpModule
{
    // Set when the application is initialized
    public static IsLicensed { get; private set; }

    public void Init(HttpApplication context)
    {
         // Check for licensing here.  Set
         // the flag accordingly.
         IsLicensded = <licensing condition>;
    }
}

その後、すべてのコンストラクターや静的コンストラクターでフラグがチェックされ、コンプライアンスが確保されます。

public class MyComponentA
{
     static MyComponentA()
     {
          // Check here.
          if (!MyLicensingHttpModule.IsLicensed)
          {
              // Bomb the *type*.
              throw new InvalidOperationException(
                  "MyComponentA is not licensed.");
          }
     }
}

public class MyComponentB
{
     public MyComponentB()
     {
          // Or check on a per-instance basis.  You'd do
          // this if you needed properties on the class level
          // to be available regardless.  This is the
          // *less* likely scenario.
          if (!MyLicensingHttpModule.IsLicensed)
          {
              // Bomb the *instance*.
              throw new InvalidOperationException(
                  "MyComponentA is not licensed.");
          }
     }
}

これにより、モジュールが強制的にインストールされ(フラグが設定されていない場合、スローされる例外が発生します)、コンポーネントを使用するすべてのページリクエストにフックして、必要に応じて使用を防ぐことができます。

このルートを使用する場合、アプリケーション全体を爆撃するのは非常に悪い形であることを強調する必要があります。コンポーネントを使用するときは、コンポーネントに集中する必要があります。これは実際にはあなたの呼びかけではありません。

開発者があなたのコンポーネントを使用しない他のページを持っている一方で、うまくレンダリングされるはずの他の有料コンポーネントを使用している可能性が非常に高いです。

また、すべてのリクエストにフックする場合は、パフォーマンスに影響を与えるために何もしないようにする必要があります。それも悪い形になります。これが、フラグを一度設定してから、必要なときに簡単なチェックを行う理由です。

于 2012-07-17T18:00:47.100 に答える