【问题标题】:Could not locate Razor Host Factory type: umbraco.MacroEngines.RazorUmbracoFactory, umbraco.MacroEngines找不到 Razor 主机工厂类型:umbraco.MacroEngines.RazorUmbracoFactory、umbraco.MacroEngines
【发布时间】:2013-07-20 11:57:06
【问题描述】:

我正在加载一个在 IIS7 和 IIS6 中使用 BlogEngine4 构建的博客,我已经完成了所有配置,并在 Google 的帮助下通过所有可能性缩小了问题范围。但我最终得到以下错误。谁有聪明的答案?

所有页面都加载正常,但只有当我加载 .cshtml 文件时页面没有加载

“/blog”应用程序中的服务器错误。

Could not locate Razor Host Factory type: umbraco.MacroEngines.RazorUmbracoFactory, umbraco.MacroEngines 

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

Exception Details: System.InvalidOperationException: Could not locate Razor Host Factory type: umbraco.MacroEngines.RazorUmbracoFactory, umbraco.MacroEngines

来源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

Stack Trace: 
[InvalidOperationException: Could not locate Razor Host Factory type: umbraco.MacroEngines.RazorUmbracoFactory, umbraco.MacroEngines]
System.Web.WebPages.Razor.WebRazorHostFactory.CreateFactory(String typeName) +178
System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) +64System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfigCore(RazorWebSectionGroup config, String virtualPath, String physicalPath) +201
System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig(String virtualPath, String physicalPath) +41
System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig(String virtualPath) +7
System.Web.WebPages.Razor.RazorBuildProvider.GetHostFromConfig() +16
System.Web.WebPages.Razor.RazorBuildProvider.CreateHost() +17
System.Web.WebPages.Razor.RazorBuildProvider.get_Host() +21
System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode() +66
System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompilerType() +39
System.Web.Compilation.BuildProvider.GetCompilerTypeFromBuildProvider(BuildProvider buildProvider) +94
System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders() +207
System.Web.Compilation.BuildProvidersCompiler.PerformBuild() +41
System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) +658
System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) +360
System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) +107
System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) +96
System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp) +13
System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp) +45
System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(String virtualPath, Type requiredBaseType) +23
System.Web.WebPages.BuildManagerWrapper.CreateInstanceOfType(String virtualPath) +228
System.Web.WebPages.VirtualPathFactoryExtensions.CreateInstance(IVirtualPathFactory factory, String virtualPath) +147
System.Web.WebPages.VirtualPathFactoryManager.CreateInstanceOfType(String virtualPath) +192
System.Web.WebPages.VirtualPathFactoryExtensions.CreateInstance(IVirtualPathFactory factory, String virtualPath) +74
System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath(String virtualPath, IVirtualPathFactory virtualPathFactory) +24
System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath(String virtualPath) +20
System.Web.WebPages.WebPageRoute.DoPostResolveRequestCache(HttpContextBase context) +250
System.Web.WebPages.WebPageHttpModule.OnApplicationPostResolveRequestCache(Object sender, EventArgs e) +94
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +135
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +168

版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.272

【问题讨论】:

  • 我认为您错过了问题中最重要的部分,即您将 blogengine 应用程序托管在 Umbraco 应用程序的虚拟目录中。这是正确的吗?

标签: iis razor umbraco virtual-directory blogengine.net


【解决方案1】:

如果您尝试在 Umbraco 站点的虚拟目录中托管 blogengine 站点,则必须修改 blogengine web.config 以“删除”所有 Umbraco 特定的处理程序和模块,因为这些将被继承由 blogengine 应用程序导致此异常,因为该应用程序在其 bin 文件夹中找不到相关的 DLL。

我最近遇到了类似的问题,我已经将我使用的 web.config 发布在下面的虚拟目录中。我的是一个非常简单的 Web 应用程序,所以显然这在您的 blogengine 应用程序中不会单独工作。您需要将相关部分添加到您的 web.config 文件中。

此外,这是针对 IIS7.5 中的 v6 Umbraco 安装,因此您可能需要进行一些试验。

<?xml version="1.0"?>

<configuration>
  <configSections>
    <remove name="urlrewritingnet" />
    <remove name="umbraco.presentation.Properties.Settings" />
    <remove name="clientDependency" />
    <remove name="Examine" />
    <remove name="ExamineLuceneIndexSets" />
    <remove name="FileSystemProviders"  />
    <remove name="log4net" />
    <remove name="BaseRestExtensions" />
    <remove name="system.web.webPages.razor" />
  </configSections>

  <appSettings>
    <clear/>
  </appSettings>

  <system.web>
    <httpModules>
      <remove name="UrlRewriteModule" />
      <remove name="UmbracoModule" />
      <remove name="ClientDependencyModule" />
    </httpModules>
    <httpHandlers>
      <remove verb="*" path="umbraco/channels.aspx" />
      <remove verb="*" path="umbraco/channels/word.aspx" />
      <remove verb="*" path="DependencyHandler.axd" />
      <remove verb="GET,HEAD,POST" path="GoogleSpellChecker.ashx" />
    </httpHandlers>    
    <compilation defaultLanguage="c#" debug="false" batch="false" targetFramework="4.0">
      <buildProviders>
        <remove extension=".cshtml" />
        <remove extension=".vbhtml" />
        <remove extension=".razor" />
      </buildProviders>
    </compilation>
    <membership>
      <providers>
        <remove name="UmbracoMembershipProvider" />
        <remove name="UsersMembershipProvider" />
      </providers>
    </membership>
    <!-- added by NH to support membership providers in access layer -->
    <roleManager enabled="false">
      <providers>
        <remove name="UmbracoRoleProvider" />
      </providers>
    </roleManager>
    <!-- Sitemap provider-->
    <siteMap defaultProvider="UmbracoSiteMapProvider" enabled="false">
      <providers>
        <remove name="UmbracoSiteMapProvider" />
      </providers>
    </siteMap>

  </system.web>

  <system.webServer>
    <modules>
      <remove name="UrlRewriteModule" />
      <remove name="UmbracoModule" />
      <remove name="ClientDependencyModule" />
    </modules>
    <handlers accessPolicy="Read, Write, Script, Execute">
      <remove name="Channels" />
      <remove name="Channels_Word" />
      <remove name="ClientDependency" />
      <remove name="SpellChecker" />
    </handlers>
  </system.webServer>

</configuration>

更新:

如果您的应用程序 web.config 中存在 &lt;system.web.webPages.razor&gt; 部分,可能还需要更新该部分,将 hostpages 条目改回其默认值:

<host factoryType="System.Web.WebPages.Razor.WebRazorHostFactory,
    System.Web.WebPages.Razor" />
<pages pageBaseType="System.Web.WebPages.WebPage">

这是因为 Umbraco 实现了它自己的主机工厂和页面库。

【讨论】:

  • 您好 Digbyswift,感谢您的回复,很高兴至少有人能理解我的问题。我想详细解释一下我们的配置和设置。我们在 IIS 7 中以应用程序池的集成 pieline 模式设置了 umbraco 6.0.6 应用程序,在 umbraco 应用程序下,我们创建了使用 BlogEngine 在应用程序池的经典模式下构建的博客。当我在子域中运行博客时 .cshtml 页面加载正常,但是当我在 umbraco 应用程序下运行时作为 virtualdir .cshtml 页面抛出相同的上述错误。
  • 很高兴为您提供帮助!是的,这是意料之中的,因为 blogengine 将继承 Umbraco 应用程序的配置。为了覆盖它,首先将虚拟目录转换为 IIS 中的应用程序。这将允许您在其自己的应用程序池中运行 blogengine。然后,如果您仍然收到错误(并且您会),请确保 blogengine web.config 删除了我在上面的回答中所说的相关设置。
  • 谢谢伙计,是的,我转换为应用程序池,但我仍然面临同样的错误。有什么方法可以分享我的 web.config 给你看看吗?
  • 嗨 Hudson,您是否已将 web.config 更改合并到您的 blogengine web.config 中?
  • 是的,我合并了您上面提到的 web.config 更改,但仍然面临以下错误,当我浏览呈现 .cshtml 页面的 blogengine 仪表板时,找不到 Razor Host Factory 类型: umbraco.MacroEngines.RazorUmbracoFactory,umbraco.MacroEngines 我相信在 blogengine web.config 中仍然缺少一些小配置。请帮助队友..
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 2014-03-08
  • 2021-01-04
  • 2023-02-04
  • 2021-04-09
  • 2011-12-14
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多