7

カスタム認証、監査、プロファイリングを行う必要がある Global.asx ファイルがあります。これが必要なのは、SAML ベースの SSO システムをサポートし、通常の .Net 認証 (SAML または混合認証をサポートしていない) をオーバーライドする必要があるためです。

.js.css.pngなどの静的ファイルに対して起動したくありません

Cassini/WebDev と IIS7 ではそうです。

私がしたいのは、this.Request.IsStaticFile(残念ながら存在しません)静的ファイルを識別するための簡単なチェックです。

これを書くのはかなり簡単だと思いますが、すでに存在していなければならないもののように感じます.IISは静的ファイルなどにキャッシュポリシーを既に適用しています.

IIS 構成の変更ではなく、コード ソリューションが必要です。

アップデート

これは私の現在の回避策です:

/// <summary>Hold all the extensions we treat as static</summary>
static HashSet<string> allowedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    ".js", ".css", ".png", ...
};

/// <summary>Is this a request for a static file?</summary>
/// <param name="request">The HTTP request instance to extend.</param>
/// <returns>True if the request is for a static file on disk, false otherwise.</returns>
public static bool IsStaticFile(this HttpRequest request)
{
    string fileOnDisk = request.PhysicalPath;
    if (string.IsNullOrEmpty(fileOnDisk))
    {
        return false;
    }

    string extension = Path.GetExtension(fileOnDisk);

    return allowedExtensions.Contains(extension);
}

これは機能し、十分に高速ですが、ひどくぎこちなく感じます。特に、考えられていない新しい静的ファイルを追加すると、拡張機能に依存するとエラーが発生しやすくなります。

IIS 構成を変更せずに、より良い方法はありますか?

4

3 に答える 3

0

どのハンドラがリクエストを処理しているかを確認できる場合があります。

IIS6 では、aspx などの .net ファイルのみが処理を行うハンドラーにマップされます。

パイプラインが統合された IIS7 では、すべてが .net 経由でルーティングされますが、これは通常は良いことです。ただし、異なるハンドラーは依然として異なるファイルタイプを処理します。特に、チェックする必要があるのは staticfilehandler だと思います。httpcontext.handlerプロパティは、あなたがそれを理解できるようにする必要があります。

その IsStatic メソッドを追加する拡張メソッドを作成できます...

サイモン

于 2011-07-13T10:13:14.517 に答える
0

ASP.NET ルーティング エンジンはこのコードを使用してファイルが存在するかどうかを判断するため、カスタム拡張メソッドを作成する必要があることは間違いありません。

if (!this.RouteExistingFiles)
{
    string appRelativeCurrentExecutionFilePath = httpContext.Request.AppRelativeCurrentExecutionFilePath;
     if (((appRelativeCurrentExecutionFilePath != "~/") && (this._vpp != null)) && (this._vpp.FileExists(appRelativeCurrentExecutionFilePath) || this._vpp.DirectoryExists(appRelativeCurrentExecutionFilePath)))
     {
          return null;
       }
}

ルーティング モジュールはハンドラーを変更する可能性があり、このモジュールは常に Application_BeginRequest の後に実行されるため、context.handler を使用して Application_BeginRequest でリクエストが静的かどうかを判断することはできません。私の提案は、ASP.NET ルーティング エンジンが使用する同様のコードを使用することです。

于 2011-07-13T12:26:31.137 に答える
0

いくつかのオプションがあります:

  • 認証を必要とせず、静的ファイルを含むパスにauthorization 要素を追加し、何も拒否しない
  • 統合パイプラインを使用しています。IIS 7 ではオフにします。
于 2011-07-13T10:20:07.717 に答える