2

OK、これは少し混乱して複雑に聞こえるかもしれませんが、ご容赦ください。

わかりやすい URL を定義できるフレームワークを作成しました。任意の URL にアクセスすると、IIS は 404 エラー (場合によっては 403;14 または 405) を表示しようとします。ただし、IIS は、これらの特定のエラーに向けられたものはすべて .aspx ファイルに送信されるように設定されています。これにより、HttpHandler を実装してリクエストを処理し、関連付けられたテンプレートを見つけて、それに関連付けられているものを実行する必要があります。

現在、これはすべて IIS 5 および 6 で機能し、IIS7 でもある程度機能しますが、フォームを投稿するときに発生する問題が 1 つあります。

フォームを存在しない URL に投稿すると、IIS は「ああ、でもその URL は存在しません」と言い、405「メソッドは許可されていません」というエラーをスローします。これらのエラーを .aspx ページにリダイレクトして HttpHandler で処理するように IIS に指示しているため、通常、これは問題になりません。しかし、IIS7 の時点で、405 にリダイレクトされた後、すべての POST 情報が失われました。そのため、フォームに関連する最も些細なことを行うことができなくなりました。

これを解決するために、HttpModule を使用してみました。これは、POST データを保持しますが、適切なタイミングで (必要なときに) 初期化されたセッションを持っていないように見えます。また、404/403;14/405 にヒットする欠落したリクエストだけでなく、すべてのリクエストに対して HttpModule を使用してみましたが、これは画像、css、js などのようなものが .NET コードによって処理されていることを意味し、これは非常に非効率的です。

これは実際の質問につながります.誰かがこれに遭遇したことがありますか?また、何かアドバイスをしたり、物事を再び機能させるために何をすべきかを知っていますか? これまでのところ、誰かが Microsoft 独自のURL Rewriting モジュールの使用を提案しています。これは私たちの問題を解決するのに役立ちますか?

ありがとう。

4

5 に答える 5

2

Post 変数がカスタム エラー ハンドラに渡されないという IIS 7 の問題は、Vista の Service Pack 2 で修正されています。Windows Server で試したことはありませんが、そこでも修正されると確信しています。

于 2009-10-19T20:37:25.350 に答える
2

IIS7 はトップダウンで .net を使用するため、HttpModule を使用するパフォーマンスのオーバーヘッドはありません。実際、すべての要求で常に使用されるマネージド HttpModule がいくつかあります。BeginRequest イベントが発生したときに、SessionStateModule が Modules コレクションに追加されていない可能性があるため、このイベント中に要求を処理しようとすると、セッション状態情報は利用できません。HttpContext.Handler プロパティを設定すると、要求されたハンドラーが必要とする場合にセッション状態が初期化されるため、IRequiresSessionState を実装する派手な 404 ページにハンドラーを設定するだけで済みます。IsMissing() メソッドの別の実装を作成する必要がある場合がありますが、以下のコードでうまくいくはずです。

using System.Web;
using System.Web.UI;

class Smart404Module : IHttpModule
{
    public void Dispose() {}

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new System.EventHandler(DoMapping);
    }

    void DoMapping(object sender, System.EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;

        if (IsMissing(app.Context))
            app.Context.Handler = PageParser.GetCompiledPageInstance(
                "~/404.aspx", app.Request.MapPath("~/404.aspx"), app.Context);
    }

    bool IsMissing(HttpContext context)
    {
        string path = context.Request.MapPath(context.Request.Url.AbsolutePath);

        if (System.IO.File.Exists(path) || (System.IO.Directory.Exists(path)
            && System.IO.File.Exists(System.IO.Path.Combine(path, "default.aspx"))))
            return true;
        return false;
    }
}

編集: IsMissing() の実装を追加しました

注: IIS7 では、セッション状態モジュールは既定ではグローバルに実行されません。2 つのオプションがあります。すべての要求に対してセッション状態モジュールを有効にする (すべての要求の種類に対してマネージ モジュールを実行することに関する上記の私のコメントを参照してください)。または、リフレクションを使用して System.Web.dll 内の内部メンバーにアクセスすることができます。

于 2008-09-20T20:02:09.947 に答える
2

Microsoft は、これに対する修正プログラムをリリースしました。

http://support.microsoft.com/default.aspx/kb/956578

于 2009-01-08T19:02:28.527 に答える
0

推測: 要求を処理している IIS7 の %windir%\system32\inetsrv\config\applicationhost.config で指定されたハンドラーは、POST 動詞の通過をまったく許可しておらず、URL が存在しません。

于 2008-09-19T15:50:54.333 に答える
0

はい、私は間違いなく URL 書き換えをお勧めします (Microsoft の IIS7 の 1 つまたは多くの代替手段の 1 つを使用します)。これはわかりやすい URL を提供するために特別に設計されたものですが、エラー ドキュメントは失敗に対する土壇場のバックストップであり、着信データを変更する傾向があるため、期待どおりにならない可能性があります。

于 2008-10-20T10:56:45.003 に答える