3

すべての 404 エラーを処理するために、カスタム HttpHandler を作成しようとしています。ハンドラーは、指定したすべてのファイル タイプをキャッチして処理していますが、何らかの理由でフォルダーの要求を処理していません。 aspx はそれを処理し、正しいエラー ページを表示しますが、mysite.com/foo/ と入力すると、ソース コードなどのない完全に空白のページが表示されます。ハンドラーのコードは次のとおりです。

public class RedirectHttpModule :IHttpHandler, IHttpModule {
public RedirectHttpModule() {
    //
    // TODO: Add constructor logic here
    //
}

public void Dispose() { }
public void Init(HttpApplication context) {
    context.Error += new EventHandler(ErrorHandler);

}

private void ErrorHandler(object sender, EventArgs e) {        
    HttpApplication application = (HttpApplication)sender;
    application.Context.Response.TrySkipIisCustomErrors = true;
    Exception lastError = application.Server.GetLastError();
    HttpException ex = lastError as HttpException;
    ILog _logger = LogManager.GetLogger(typeof(Page));
    string page = "~/404.aspx";
    if (ex != null) {
        application.Server.ClearError();
        application.Context.Handler = System.Web.UI.PageParser.GetCompiledPageInstance(page, application.Server.MapPath(page), application.Context);
        string username = application.Context.User.Identity.Name;
        if (!String.IsNullOrEmpty(username)) _logger.ErrorFormat("HTTP Error {0}: {1} Username: {2}", ex.GetHttpCode().ToString(), ex.Message, username);

        else _logger.ErrorFormat("HTTP Error {0}: {1}", ex.GetHttpCode().ToString(), ex.Message);
    }
    else {
        application.Context.Handler = System.Web.UI.PageParser.GetCompiledPageInstance(page, application.Server.MapPath(page), application.Context);
    }
}

public bool IsReusable {
    get { return true; }
}

public void ProcessRequest(HttpContext context) {
    if (!File.Exists(context.Request.PhysicalPath)) {
        throw new HttpException(404, String.Format("The file or directory {0} does not exist.", context.Request.PhysicalPath));
    }
    else {
        context.Response.TransmitFile(context.Request.PhysicalPath);
    }
}

}

Web.config の関連セクションは次のとおりです。

<handlers>
    <add name="html-to-aspx-isapi" path="*.html" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
    <add name="html-to-aspx" path="*.html" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" preCondition="integratedMode" />
    <add name="htm-to-aspx-isapi" path="*.htm" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
    <add name="htm-to-aspx" path="*.htm" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" preCondition="integratedMode" />
    <add name="asp-to-aspx-isapi" path="*.asp" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
    <add name="asp-to-aspx" path="*.asp" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" preCondition="integratedMode" />
    <add name="RedirectHttpModule" modules="RedirectHttpModule" preCondition="" path="*" verb="*" resourceType="Either"/>
</handlers>

<modules runAllManagedModulesForAllRequests="true">
    <add name="RedirectHttpModule" type="RedirectHttpModule" preCondition="managedHandler"/>
</modules>

なんらかの理由で、Classic ではなく Integrated を実行していても、最初の 6 つのハンドラーを削除すると、ASP.NET で html、htm、または asp 要求を処理できなくなります。ある種の構成上の問題があるのではないかと疑い始めています。何か案は?

ご協力いただきありがとうございます。

4

1 に答える 1

1

IIS で、既定の 404 ページがハンドラーを指すように設定します。何が起こっているかというと、IIS が .net ワーカー プロセスに到達する前に 404 を処理しているということです。

于 2012-10-02T21:06:14.673 に答える