【发布时间】:2014-07-24 14:22:38
【问题描述】:
我们正在将我们的 Web 应用程序从 .NET 框架 3.5 迁移到 4.5
在我们的开发机器上,我们使用的是 VS2012 并运行 Windows 7 操作系统
在这个过程中我们得到了以下错误
基类包含字段“htmlTag”,但其类型(System.Web.UI.HtmlControls.HtmlGenericControl)与控件类型(System.Web.UI.HtmlControls.HtmlElement)不兼容
对应的HTML是
<html xmlns="http://www.w3.org/1999/xhtml" class="no-js" runat="server" id="htmlTag">
而对应的设计器代码为(.cs.designer文件)
protected global::System.Web.UI.HtmlControls.HtmlGenericControl htmlTag;
完整的堆栈跟踪在这里..
System.Web.HttpParseException (0x80004005):基类包含字段“htmlTag”,但其类型(System.Web.UI.HtmlControls.HtmlGenericControl)与控件类型(System.Web.UI)不兼容.HtmlControls.HtmlElement)。在 System.Web.Compilation.BaseTemplateCodeDomTreeGenerator.BuildFieldDeclaration(ControlBuilder builder) 在 System.Web.Compilation.BaseTemplateCodeDomTreeGenerator.BuildSourceDataTreeFromBuilder(ControlBuilder builder, Boolean fInTemplate, Boolean topLevelControlInTemplate, PropertyEntry pse) 在 System.Web.Compilation.BaseTemplateCodeDomTreeGenerator.BuildSourceDataTreeFromBuilder(ControlBuilder builder , Boolean fInTemplate, Boolean topLevelControlInTemplate, PropertyEntry pse) 在 System.Web.Compilation.TemplateControlCodeDomTreeGenerator.BuildMiscClassMembers() 在 System.Web.Compilation.PageCodeDomTreeGenerator.BuildMiscClassMembers() 在 System.Web.Compilation.BaseCodeDomTreeGenerator.BuildSourceDataTree() 在 System.Web .Compilation.BaseCodeDomTreeGenerator.GetCodeDomTree(CodeDomProvider codeDomProvider, StringResourceBuilder stringResourceBuilder, VirtualPath virtualPath) 在 System.Web.Compilation.BaseTemplateBuildProvider.GenerateCode(AssemblyBuilder assemblyBuilder) 在 System.Web.Co mpilation.AssemblyBuilder.AddBuildProvider(BuildProvider buildProvider) 在 System.Web.Compilation.AssemblyBuilder.AddBuildProvider(BuildProvider buildProvider) 在 System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders() 在 System.Web.Compilation.BuildProvidersCompiler.PerformBuild() 在 System. Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) 在 System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) 在 System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) at Syste m.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp) 在 System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) 在 System.Web。 HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 错误方法:无效 AddBuildProvider(System.Web.Compilation.BuildProvider) 帮助链接:
为了解决这个问题,我们按照此链接http://support.microsoft.com/kb/941824/en-us 中给出的步骤进行操作
本质上我们只是剪切 HTML 并将其粘贴回来.. 重新生成设计器代码如下
protected global::System.Web.UI.HtmlControls.HtmlElement htmlTag;
这看起来是解决问题的合乎逻辑的方法,它也适用于少数机器,但同样的修复破坏了其他开发人员机器上的代码,尤其是部署到我们生产 Web 服务器的代码。请注意,我们在生产服务器上运行 Windows Server 2008 R2 Datacenter,并且我们在机器上安装了 .Net Framework 4.5。以下是我们修改后得到的错误
基类包含字段“htmlTag”,但其类型(System.Web.UI.HtmlControls.HtmlElement)与控件类型(System.Web.UI.HtmlControls.HtmlGenericControl)不兼容
您会看到错误消息与本文中的第一条错误消息正好相反
在那些现在出错的机器中,如果我们将控件的类型留给HTMLGenericControl,错误就会消失
我们尝试比较了机器上与 .net 框架相关的服务包,这些服务包在正常工作的机器上与那些不工作的机器上进行比较,我们真的没有注意到任何可能导致错误的东西
这种情况是不可接受的,因为我们的团队分布在多个地理位置,我们无法就修复本地环境的方法与每个团队进行协调。此外,我们无法通过更改签入此文件,因为它会对许多人造成破坏,并且将其发布到生产中也将很困难
您能帮我们解决这个问题吗
【问题讨论】:
-
'我们在机器上安装了 .Net Framework 4.5' -> 但是应用程序的 AppPool 是否实际配置为使用它? (即很像在 VS 中,您选择一个 CLR 进行编译,您选择一个 CLR 在服务器端运行)。 (应用程序池 - 选择合适的 - 基本设置 - .Net Framework版本
-
在 IIS 中,.Net Runtime 版本已经是 4.0
-
你检查过web.config
type lines吗? -
是的,它也存在,但问题仍未解决