从ASP.NET MVC 1迁移到ASP.NET MVC 2后出现的PathTooLongException问题

4

我已经将我的应用程序从MVC 1更新到了MVC 2。然后,一些页面会抛出PathTooLongException异常:

[PathTooLongException: The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.]
   System.IO.Path.SafeSetStackPointerValue(Char* buffer, Int32 index, Char value) +7493057
   System.IO.Path.NormalizePathFast(String path, Boolean fullCheck) +387
   System.IO.Path.NormalizePath(String path, Boolean fullCheck) +36
   System.IO.Path.GetFullPathInternal(String path) +21
   System.Security.Util.StringExpressionSet.CanonicalizePath(String path, Boolean needFullPath) +73
   System.Security.Util.StringExpressionSet.CreateListFromExpressions(String[] str, Boolean needFullPath) +278
   System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList) +87
   System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String path) +65
   System.Web.InternalSecurityPermissions.PathDiscovery(String path) +29
   System.Web.HttpRequest.MapPath(VirtualPath virtualPath, VirtualPath baseVirtualDir, Boolean allowCrossAppMapping) +146
   System.Web.HttpRequest.MapPath(VirtualPath virtualPath) +37
   System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage) +43
   System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) +28
   System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) +22
   System.Web.Mvc.ViewPage.RenderView(ViewContext viewContext) +284
   System.Web.Mvc.WebFormView.RenderViewPage(ViewContext context, ViewPage page) +82
   System.Web.Mvc.WebFormView.Render(ViewContext viewContext, TextWriter writer) +85
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +267
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +10
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +320
   System.Web.Mvc.Controller.ExecuteCore() +104
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +36
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +34
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +53
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +30
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +7
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8678910
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

我知道ASP.NET中260字符URL长度的问题,但在更新到ASP.NET MVC 2.0之前,我的应用程序运行良好!

这个问题不仅出现在本地,而且在远程托管上也会出现

我比较了RenderView方法的实现。

MVC 1:

public virtual void RenderView(ViewContext viewContext) {
    ViewContext = viewContext;
    InitHelpers();
    // Tracing requires Page IDs to be unique.
    ID = Guid.NewGuid().ToString();
    ProcessRequest(HttpContext.Current);
}

MVC 2:

public virtual void RenderView(ViewContext viewContext) {
    ViewContext = viewContext;
    InitHelpers();

    bool needServerExecute = false;

    SwitchWriter switchWriter = viewContext.HttpContext.Response.Output as SwitchWriter;
    if (switchWriter == null) {
        switchWriter = new SwitchWriter();
        needServerExecute = true;
    }

    using (switchWriter.Scope(viewContext.Writer)) {
        if (needServerExecute) {
            // It's safe to reset the _nextId within a Server.Execute() since it pushes a new TraceContext onto
            // the stack, so there won't be an ID conflict.
            int originalNextId = _nextId;
            try {
                _nextId = 0;
                viewContext.HttpContext.Server.Execute(HttpHandlerUtil.WrapForServerExecute(this), switchWriter, true /* preserveForm */);
            }
            finally {
                // Restore the original _nextId in case this isn't actually the outermost view, since resetting
                // the _nextId may now cause trace ID conflicts in the outer view.
                _nextId = originalNextId;
            }
        }
        else {
            ProcessRequest(HttpContext.Current);
        }
    }
}

也许你还改变了项目的(虚拟)位置,或者存储视图的文件夹? - H H
没有,项目的实际位置没有改变。 - admax
2个回答

6

这更多是ASP.NET 4.0的默认限制,而不是ASP.NET MVC 1.0到2.0迁移问题。请尝试在web.config增加此限制

<httpRuntime maxUrlLength="1000" relaxedUrlToFileSystemMapping="true" />

我使用的是.NET 3.5,因此无法将maxUrlLengthrelaxedUrlToFileSystemMapping应用到web.config中的httpRuntime元素。 - admax
这解决了我在HttpRequest.MapPath中遇到的PathTooLong异常。 - mcintyre321

0
问题已经解决。它是由Spring.NET引起的。WebApplicationContext与ASP.NET MVC 1.0正确地工作。但是,WebApplicationContext + ASP.NET MVC 2.0会导致PathTooLongException。现在我只需切换到XmlApplicationContext,所有页面都可以正常呈现,没有错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接