摘要摘要: 当我将System.Web.WebPages.dll添加到我的应用程序的bin文件夹时,我的Web应用程序中的.NET框架开始在路径中生成"非法字符。"像这样的请求崩溃: http://qa.postjobfree.com/autocompleteskills/%22myskill
当我从bin文件夹中删除System.Web.WebPages.dll时 - 错误消失了。 为什么会这样?
以下是Q& A表格中的详细说明。
Q1:如果System.Web.WebPages.dll已经是.NET框架的一部分,为什么要将System.Web.WebPages.dll添加到bin文件夹?
因为我想将MVC添加到现有的Web窗体应用程序中。 最新版本的MVC需要将System.Web.WebPages.dll(以及另外5个DLL)添加到bin文件夹中。
Q2:您是否尝试过设置relaxedUrlToFileSystemMapping标志?
是。感谢Scott Hanselman和Stack溢出的多个答案,我将此配置添加到我的Web.Config:
<system.web>
<httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="" maxRequestLength="8192" />
</system.web>
几年前我添加了它,并修复了#34;路径中的非法字符。&#34;崩溃。
现在,当我将System.Web.WebPages.dll添加到web app bin文件夹时 - Hanselman的解决方案不再有用了,而且我再次崩溃了。 以下是解决问题的可能提示:在.NET 4.0(大约2010年)之前,不支持requestPathInvalidCharacters标记。
问题3:那是否&#34;路径中的非法字符。&#34;崩溃发生在所有计算机上?
没有。 不幸的是它在生产中崩溃,但在我的开发机器上没有崩溃。
问题4:您的生产机器和开发机器之间有什么区别?
生产机器具有Windows Server 2012 R2 Microsoft Windows [版本6.3.9600]
开发机器有Windows 7 Microsoft Windows [版本6.1.7601]
开发机器已安装Microsoft Visual Studio 2013。
生产只有.NET Framework 4.5.1(与开发相同)。
但生产和开发机器之间最相关的区别在于安装到GAC的System.Web.WebPages.dll版本。 在我的研究中,我发现了3个不同版本的System.Web.WebPages.dll:
v1
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Web.WebPages\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.dll
Size: 136,552 bytes
File version: 1.0.20105.407
Product version: 1.0.20105.407
v2
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Web.WebPages\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.dll
Size: 204,480 bytes
File version: 2.0.20710.0
Product version: 2.0.20710.0
v3
C:\dennis\projects\ijs\PostJobFreeWeb\bin\System.Web.WebPages.dll
Size: 211,664 bytes
File version: 3.0.20129.0
Product version: 3.0.1-20129
我的生产机器上有G1的G1。 我的开发机器上有G2的v2。 我从MVC nuget包中获得v3并将其放入我的网络应用程序的bin文件夹中。
问题5:您是否尝试将不同版本的DLL放入bin文件夹?
是的,我做到了。
我发现将v1放入生产机器上的bin文件夹中不会导致&#34;路径中出现非法字符。&#34;崩溃。
我发现将v2或v3放入bin文件夹会导致&#34;路径中出现非法字符。&#34;崩溃。
所以,基本上,如果bin文件夹中的dll与GAC中的dll匹配 - 则没有问题。 但如果存在不匹配 - 那么网络项目行为不端。
我还尝试将v1 dll放入我的开发机器上的bin文件夹中(dev机器在GAC中有v2)。这没有造成任何问题。
Q6:错误堆栈跟踪?
Message:
Illegal characters in path.
Type: System.ArgumentException
Stack:
at System.IO.Path.Combine(String path1, String path2)
at System.Web.Compilation.DiskBuildResultCache.GetBuildResult(String cacheKey, VirtualPath virtualPath, Int64 hashCode, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetBuildResultFromCacheInternal(String cacheKey, Boolean keyFromVPP, VirtualPath virtualPath, Int64 hashCode, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResultFromCacheInternal(VirtualPath virtualPath, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound)
at System.Web.WebPages.BuildManagerWrapper.ExistsInPrecompiledSite(String virtualPath)
at System.Web.WebPages.VirtualPathFactoryManager.Exists(String virtualPath)
at System.Web.WebPages.DefaultDisplayMode.GetDisplayInfo(HttpContextBase httpContext, String virtualPath, Func`2 virtualPathExists)
at System.Web.WebPages.DisplayModeProvider.GetDisplayInfoForVirtualPath(String virtualPath, HttpContextBase httpContext, Func`2 virtualPathExists, IDisplayMode currentDisplayMode, Boolean requireConsistentDisplayMode)
at System.Web.WebPages.WebPageRoute.GetRouteLevelMatch(String pathValue, String[] supportedExtensions, Func`2 virtualPathExists, HttpContextBase context, DisplayModeProvider displayModeProvider)
at System.Web.WebPages.WebPageRoute.MatchRequest(String pathValue, String[] supportedExtensions, Func`2 virtualPathExists, HttpContextBase context, DisplayModeProvider displayModes)
at System.Web.WebPages.WebPageRoute.DoPostResolveRequestCache(HttpContextBase context)
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)