2010-05-31 4 views
4

Je l'avais mis à jour mon application MVC de 1 à MVC 2. Après que quelques pages lancers francs PathTooLongException:PathTooLongException après la migration d'ASP.NET MVC 1 à ASP.NET MVC 2

[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 

Je sais que la question avec 260 -character-url-longueur dans ASP.NET, mais mon application fonctionne bien avant la mise à jour vers ASP.NET MVC 2.0!

Ce problème se produit non seulement localement, mais sur un hébergement à distance trop

Je compare RenderView implémentations de méthode.

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); 
     } 
    } 
} 
+0

Peut-être avez-vous également modifié l'emplacement (virtuel) de votre projet ou le dossier dans lequel les vues sont stockées? –

+0

Non, l'emplacement du projet phisical n'a pas été modifié. – admax

Répondre

6

Ceci est plus d'une limite par défaut ASP.NET 4.0 plutôt que ASP.NET MVC 1,0 à 2,0 de problème de migration. Essayez increasing this limit à web.config:

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

J'utilise .NET 3.5 donc je ne peux pas appliquer 'maxUrlLength' et' relaxedUrlToFileSystemMapping' à l'élément 'httpRuntime' dans web.config. – admax

+0

Cela a corrigé une exception PathTooLong que je recevais dans HttpRequest.MapPath – mcintyre321

0

problème est résolu. Il a été provoqué par Spring.NET. WebApplicationContext fonctionne correctement avec ASP.NET MVC 1.0. Mais couple WebApplicationContext + ASP.NET MVC 2.0 provoque PathTooLongException. Maintenant, je viens de passer à XmlApplicationContext et toutes les pages rend sans erreurs.