部署(IIS)后找不到嵌入式Razor视图

时间:2012-10-18 14:57:15

标签: c# asp.net-mvc iis embedded-resource

我目前正在开发一个具有插件式系统的项目。一旦web项目启动,它就会查找插件dll并构建GUI。 dll包含嵌入式视图和嵌入式资源,如图片或javascripts。

  • 我使用RazorGenerator(VS插件)从视图生成cs文件,视图的构建操作设置为“嵌入资源”,自定义工具设置为“RazorGenerator”

    < / LI>
  • 我使用自定义虚拟路径提供程序(非常类似于此one

  • 我通过网络上找到的这种解决方法注册了我的虚拟路径提供程序(这是必须的,因为如果我不使用它,它不会像预期的那样工作):

        var assemblyResourceProvider = new AssemblyResourceProvider();
        var hostingEnvironmentInstance = (HostingEnvironment)typeof(HostingEnvironment).InvokeMember("_theHostingEnvironment", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null);
        if (hostingEnvironmentInstance == null)
            return;
    
        var mi = typeof(HostingEnvironment).GetMethod("RegisterVirtualPathProviderInternal", BindingFlags.NonPublic | BindingFlags.Static);
        if (mi == null)
            return;
    
        mi.Invoke(hostingEnvironmentInstance, new object[] { assemblyResourceProvider });
    
  • 我在RouteConfig.cs中使用它来使嵌入的脚本和图片文件有效:

       routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(css|js|gif|png|jpg|exe)(/.*)?" });
    
  • 我将这些行(还有更多)添加到我的web.config中,告诉asp使用我的路径提供程序来嵌入我的源代码:

      <add name="AspNetStaticFileHandler-PNG" path="*.png" verb="GET,HEAD" type="System.Web.StaticFileHandler"/>
    
  • 我使用Boc.Web.PrecompiledViews dll来注册RazorGenerator生成的路径属性

    BoC.Web.Mvc.PrecompiledViews.ApplicationPartRegistry.Register(assembly);
    

Visual Studio中的所有内容都按预期工作。嵌入在dll中的视图和资源正在展示并且完美地工作。我还使用IIS 7.5从Visual Studio运行我的Web应用程序。所有可能性都有效:

  • 如果我给出Razor Generator生成的虚拟路径(例如:“〜/ Views / ViewTest / Test)
  • 如果我给出使用我的resourceprovider的Dll资源路径(例如:“DllResources / ViewTest.dll / Views / ViewTest / Test.cshtml)

然而,在我部署我的网络应用程序并使用IIS 7.5运行它之后,视图(只有视图!)没有显示!如果我使用虚拟路径(选项1)寻址视图,IIS会给出以下错误消息:

    The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:

如果我使用DllResources路径(选项2)处理视图,IIS会给出以下错误消息:

    The file '/Views/ViewTest/DllResources/EmbeddedResourceTest/Views/ViewTest/Test.cshtml' has not been pre-compiled, and cannot be requested.

我现在不知道该怎么做才能让它发挥作用。我试图用其他解决方案替换每一步。结果仍然相同。完美地在VS中工作,但部署后没有显示视图。

是IIS的一些配置缺少什么?我错过了web.config中的内容吗? 请帮我解决这个问题。

谢谢, 诺贝特

1 个答案:

答案 0 :(得分:0)

好的,经过一周的痛苦,我终于找到了解决方案。 问题在于发布网络项目。 这是我做的:

我一直在Microsoft.Net文件夹中使用aspnet_compiler发布我的网络应用程序。这是由成功的Web项目构建触发的构建后事件。我删除了此事件,并将其替换为Web项目的.csproj文件中的“AfterBuild”脚本。我在this question找到了该脚本。使用这种新的发布方法,最终会显示嵌入的视图。

希望这有助于将来。

此致