我目前正在开发一个具有插件式系统的项目。一旦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应用程序。所有可能性都有效:
然而,在我部署我的网络应用程序并使用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中的内容吗? 请帮我解决这个问题。
谢谢, 诺贝特
答案 0 :(得分:0)
好的,经过一周的痛苦,我终于找到了解决方案。 问题在于发布网络项目。 这是我做的:
我一直在Microsoft.Net文件夹中使用aspnet_compiler发布我的网络应用程序。这是由成功的Web项目构建触发的构建后事件。我删除了此事件,并将其替换为Web项目的.csproj文件中的“AfterBuild”脚本。我在this question找到了该脚本。使用这种新的发布方法,最终会显示嵌入的视图。
希望这有助于将来。
此致