0

一部が Web フォーム (Umbraco CMS) で一部が MVC であるサイトがあります。これは、MVC 機能を処理するための HttpHandler です。

public class Mvc : MvcHttpHandler
{
    protected override void ProcessRequest(HttpContext httpContext)
    {
        httpContext.Trace.Write("Mvc.ashx", "Begin ProcessRequest");
        string originalPath = httpContext.Request.Path;
        string newPath = httpContext.Request.QueryString["mvcRoute"];
        if (string.IsNullOrEmpty(newPath))
            newPath = "/";

        httpContext.Trace.Write("Mvc.ashx", "newPath = "+newPath );

        HttpContext.Current.RewritePath(newPath, false);
        base.ProcessRequest(HttpContext.Current);
        HttpContext.Current.RewritePath(originalPath, false);
        }
}

実装方法の詳細はこちら この方法は、MVC 1.0 Web サイトでうまく機能します。ただし、 Microsoft のアップグレード ドキュメントの手順に従って、このサイトを MVC 2.0 にアップグレードすると、実行時にこの例外が発生することを除いて、すべてがコンパイルされます。

「/」アプリケーションでサーバー エラーが発生しました。
リソースが見つかりません。
説明: HTTP 404。探しているリソース (またはその依存関係の 1 つ) は、削除されたか、名前が変更されたか、一時的に利用できない可能性があります。次の URL を見直して、スペルが正しいことを確認してください。

要求された URL: /mvc.ashx

バージョン情報: Microsoft .NET Framework バージョン:2.0.50727.4927; ASP.NET バージョン:2.0.50727.4927

このリソースとその依存関係は、MVC 1.0 では正常に検出されましたが、MVC 2.0 では検出されませんでした。追加する必要がある追加の依存関係はありますか? 足りないものはありますか?MVC 2.0 の動作に変更はありますか?

4

2 に答える 2

3

これは私がやったことであり、うまくいきます...

public class mvc : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext httpContext)
    {
        string originalPath = httpContext.Request.Path;
        HttpContext.Current.RewritePath(httpContext.Request.ApplicationPath, false);
        IHttpHandler httpHandler = new MvcHttpHandler();
        httpHandler.ProcessRequest(HttpContext.Current);
        HttpContext.Current.RewritePath(originalPath, false);
    }

}
于 2010-06-03T17:46:15.400 に答える
3

注意事項 - MvcHandler および MvcHttpHandler 型は、ユーザー コードによってサブクラス化されることを意図していません。これらのハンドラーは、フレームワークの将来のバージョンで変更されるため、それらをサブクラス化するすべての型が壊れる可能性があります。それを念頭に..

MVC 2 では、 MvcHttpHandler 型はIHttpHandlerではなくIHttpAsyncHandlerです。これにより、ASP.NET がハンドラーを実行する方法の意味が変わります。MvcHttpHandler をサブクラス化する場合は、 ProcessRequestメソッドに加えて、BeginProcessRequestメソッドとEndProcessRequestメソッドをオーバーライドする必要があります。

より安全なメカニズムは、サブクラス化する代わりに MvcHttpHandler をラップすることです。つまり、 ProcessRequest() メソッドがnew MvcHttpHandler.ProcessRequest()に委譲するだけの独自の IHttpHandler を作成します。このように、MvcHttpHandler の動作を変更しても、ラッピング ハンドラーが破損することはありません。

于 2010-03-18T22:46:22.447 に答える