0

我有一个网站,其中一部分是网络表单(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 网站中运行良好。但是,当我按照Microsoft 升级文档中的步骤将此站点升级到 MVC 2.0 时;一切都编译,除了在运行时我得到这个异常:

“/”应用程序中的服务器错误。
无法找到该资源。
说明:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请查看以下 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

需要注意的是 - MvcHandler 和 MvcHttpHandler 类型不应该被用户代码子类化。这些处理程序将随着框架的未来版本而改变,因此任何子类化它们的类型都会受到破坏。考虑到这一点..

在 MVC 2 中,MvcHttpHandler 类型是 IHttpAsyncHandler 而不仅仅是IHttpHandler。这改变了 ASP.NET 如何执行处理程序的语义。如果子类化 MvcHttpHandler,除了ProcessRequest方法之外,还需要重写BeginProcessRequestEndProcessRequest方法。

更安全的机制是包装 MvcHttpHandler 而不是子类化它。也就是说,创建自己的 IHttpHandler ,其 ProcessRequest() 方法只是委托给new MvcHttpHandler.ProcessRequest()。这样,对 MvcHttpHandler 工作的更改不应导致您的包装处理程序中断。

于 2010-03-18T22:46:22.447 回答
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 回答