2

QueryString["path"]main.css などの独自の css ファイルに対して、すべてのものから縮小および圧縮するための css ファイルを取得しています。しかし、webresource ファイルにアクセスしようとすると、500 エラーが発生します。webresource.axd の後に続くパラメーターは大文字と小文字が区別され、QueryString["path"]小文字から受け取ります。

これは私が得るものですQueryString["path"]

http://localhost/test/webresource.axd?d=-phgrn6r6zgehvbi697-bxvkl_gidnplxpdeukz5kncgr9hvnfvttpgykwyw05cda-nymtz9od_bbww3ynzxha2&t=633789305460522066

上記のリンクはエラーを生成します: CryptographicException: パディングが無効であり、削除できません。

正しいリンクは次のようになります。

http://localhost/test/WebResource.axd?d=-pHGRn6r6ZGehvBI697-BxVKl_GIdNPlxPdEUKZ5KNcGR9hvnfVtTpgyKwYw05cDa-NymTz9OD_bBwW3ynZXhA2&t=633789305460522066

唯一の違いはケースにあります。CryptographicException は一般的なようですが、machineKey を設定しても問題は解決しませんでした。元のケースで webresource.axd を取得する方法についてのヒントはありますか?

編集

コードが要求されました:

public void ProcessRequest(HttpContext context) {
    Control c = new Control();
    string root = context.Request.Url.GetLeftPart(UriPartial.Authority);
    string path = context.Request.QueryString["path"];
    string content = string.Empty;

    if (!string.IsNullOrEmpty(path)) {
        if (context.Cache[path] == null) {
            List<string> dependencies = new List<string>();
            string[] styles = path.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string style in styles) {
                content += RetrieveStyle(root + c.ResolveUrl(style)) + Environment.NewLine;
                dependencies.Add(context.Server.MapPath(style));
            }
            content = StripWhitespace(content);
            context.Cache.Insert(path, content, new CacheDependency(dependencies.ToArray()), Cache.NoAbsoluteExpiration, new TimeSpan(DAYS_IN_CACHE, 0, 0, 0));
        }
    }
}

を呼び出すと、RetreiveStyle でクラッシュします。

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
4

2 に答える 2

0

回答はありませんが、同様の問題が発生したため、問題の特定に役立つ可能性があるいくつかの追加事項があります. それで、ここに行きます:

Base64 形式のトークンを含む GET 要求を受け入れる iHTTPHandler (Login.ashx と呼びましょう) があります。その後、トークンは Rijndael アルゴリズムを使用して復号化されます。

ほとんどの場合、このプロセスは機能していますが、先月、System.Security.Cryptography.CryptographicException: Padding is invalid and cannot be removed. が原因で失敗した要求がいくつかありました。エラー。このエラーは、トークン (base64 文字列) が小文字で復号化できない場合に発生します。

ログとアクティビティ レコードを調べたところ、特定のユーザーが Login.ashx を介してこちらにアクセスしようとしたところ、問題のエラーが原因でリクエストが失敗したことがわかりました。名前と値を含むリクエストのクエリ文字列全体 (トークンだけではありません) は小文字です。次に、同じユーザーが数分後にログインを試み、クエリ文字列が小文字に変換されていないため、ログインできます。

そのため、問題はブラウザに関連している可能性があると感じています。プロキシがこれに影響するかどうかはわかりません。

追加情報: サーバー変数に取り込まれたブラウザー情報はありません。ALL_HTTP および ALL_RAW 変数にはほとんどデータがありません。

  • ALL_HTTP HTTP_CACHE_CONTROL: キャッシュなし HTTP_HOST: サーバー名
  • ALL_RAW Cache-Control: キャッシュなし Host: サーバー名

HTTP_REFFERER もありません。

この問題をさまざまなブラウザー (Safari3、Chrome1、Opera9.2、IE6、7、8、Firefox3) で再現しようとしましたが、うまくいきませんでした。

10台のサーバーが同じように構成されたWebファームがあります(少なくともそうであることを願っています)

進展がありましたら情報を追加します。

于 2009-07-14T18:43:25.087 に答える