我们一直致力于一个非常依赖ASP.NET中的VirtualPathProviders的应用程序.
我们刚刚将这个东西放在一个实时服务器上来演示它,看起来VirtualPathProviders 在网站预编译时根本不起作用 !!
我一直在看这里发布的解决方法:http://sunali.com/2008/01/09/virtualpathprovider-in-precompiled-web-sites/,但到目前为止我还没有得到那要工作,要么!(好吧 - 它在visual studio的Web开发服务器上运行良好 - 只是不在我们的IIS盒子上 - 再次!).
这里有人有关于这个问题的更多信息吗?它是否在.NET v3.5中修复(我们目前正在为v2.0构建)?
是否可以使用Web部署项目发布Web应用程序项目而无需预编译?
为了将Web控件和页面拆分为单独的程序集,我使用自定义VirtualPathProvider来加载这些资源.我在cmd行使用Web部署项目和msbuild来部署这些项目.
问题的关键在于预编译应用程序不支持VirtualPathProviders.我在这里找到了常规文件的解决方法.但是,这不适用于诸如ascx和aspx页面之类的应用程序文件.它引发了一个例外,即"文件尚未预编译,无法请求".
因此,我决定尝试完全放弃预编译,并且由于我们的网站流量不是特别高,因此初始请求性能受到影响.但是,我无法弄清楚如何使用Web部署项目来实现这一点,这些项目已经非常适合我们的构建过程.
[更新]我正在研究自定义Microsoft.WebDeployment.targets文件以实现此目的,但到目前为止我还没有运气.
[更新]在Microsoft.WebDeployment.targets文件中进行挖掘时,我发现没有直接的方法将Web部署项目与Web应用程序预编译分离.事实上,我不确定是否有任何需要.我现在使用的是类似于以下代码段的内容.我只是将它放入项目文件中,条件为attr,不为Debug版本部署.
<Target Name="AfterBuild">
<!-- clean output dir -->
<CreateItem Include="$(output)**\*.*">
<Output TaskParameter="Include" ItemName="OldFiles"/>
</CreateItem>
<Delete ContinueOnError="true"
TreatErrorsAsWarnings="true" Files="@(OldFiles)"/>
<!-- copy content -->
<Copy SourceFiles="@(Content)"
DestinationFolder="$(output)%(Content.RelativeDir)" />
<CreateItem Include="$(OutputPath)\*">
<Output TaskParameter="Include" ItemName="Binaries" />
</CreateItem>
<Copy SourceFiles="@(Binaries)" DestinationFolder="$(output)bin" />
<ReplaceConfigSections RootPath="$(output)"
WebConfigReplacementFiles="@(ConfigFiles)"
UseExternalConfigSource="true"
ValidateSectionElements="true"/>
</Target>
Run Code Online (Sandbox Code Playgroud)
似乎这就是在没有预编译的情况下部署项目所需的全部内容.如果你发现更好的东西,请告诉我.
asp.net virtualpathprovider web-deployment-project precompiled
我正在使用便携式区域做一些开发工作,所以我有一个被覆盖的VirtualPathProvider.
我 public override bool FileExists(string virtualPath)似乎每隔几分钟就会调用一次,这意味着MVC正在缓存视图.
这可能是很好的生产,但我无法弄清楚如何在开发中关闭它.我希望在VirtualPathProvider每次使用视图时调用它.
有什么建议?
我有一个关于C#和Windows API的一般问题:
我的任务是从文档管理系统(DMS)加载文件,并从该文件创建一个字节数组.从DMS的开发人员那里得到了一个dll,提供了这样的方法:
loadFile(int DocId, string PathToSaveFile);
Run Code Online (Sandbox Code Playgroud)
不幸的是,给定的dll没有为我提供一种方法来将所请求的文件作为字节数组或任何类型的流传递.现在我的问题是,C#是否可以创建某种虚拟路径,而这种路径在二级存储上实际上并不存在.相反,写入此路径的所有位和字节都会在流中转发给我?我的目的是提高性能,因为我不必将数据写入硬盘.
我已经搜索了很多,但实际上不知道我必须寻找的关键字.也许有人可以给我一个提示,或者只是告诉我根本不可能.
目前我VirtualPathProvider在Asp.net MVC Web应用程序中有自定义.
这将VirtualPathProvider检查路径中的Area "/{Area}/{Controller}/..."并使用该NameSpace.{Area}.Main.dll模块将该程序集中包含的视图作为Embedded Resources返回.
这个伟大的工程,我没有部署任何ascx,js,css文件.
现在我的问题是:
我想在程序集中预编译aspx和ascx文件,而不是将视图作为嵌入资源,我将使用Response.Write的视图类.
我可以使用它预编译视图,aspnet_compiler但是在ViewEngine尝试查找视图并且失败时我一直收到错误.
我的主要目标是让第一次使用某个视图/用户控件的方式更快,不要等待编译发生.
这是一项要求,因为应用程序可以分组为插件,并且此插件可以部署到Bin目录中.
有什么想法吗?
asp.net-mvc virtualpathprovider embedded-resource precompiled
我有一个虚拟路径提供程序,它从我的虚拟文件系统提供静态文件,是否可以通过我的虚拟路径提供程序将IIS配置为服务器静态文件,还是需要创建自定义静态文件处理程序?
我目前正在尝试创建一个类库并将MVC视图嵌入其中,以便我们可以在多个站点上共享它,如下所述:http://www.wynia.org/wordpress/2008/12/aspnet-mvc-plugins /
性能很重要,所以我想弄清楚这是否可行.如果可能的话,有人可以稍微解释一下VirtualPathProvider吗?
我注意到这个方法只为每个文件调用一次.
public override VirtualFile GetFile(string virtualPath)
{
if (ResourceFileExists(virtualPath))
return new EmbeddedVirtualFile(virtualPath);
return base.GetFile(virtualPath);
}
Run Code Online (Sandbox Code Playgroud)
VirtualPathProvider是否自动缓存文件/视图?在另一篇文章中(解释相同的事情),他们声明你应该覆盖GetCacheDependency:
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
{
if (ResourceFileExists(virtualPath))
// Return null or otherwise ASP.NET will try to monitor the file.
// Is actually the default implementation.
return null;
return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
Run Code Online (Sandbox Code Playgroud)
所以在这里返回null不会影响VirtualFile的"缓存"?我问这个的原因是因为我们创建的VirtualFile的自定义实现,称为EmbeddedVirtualFile,在重写的Open()方法中使用了这段代码:
var assembly = Assembly.LoadFile(assemblyName);
if (assembly != null)
{
Stream resourceStream = assembly.GetManifestResourceStream(resourceName);
return resourceStream;
}
Run Code Online (Sandbox Code Playgroud)
我有点害怕这会有性能损失.有人可以安慰我吗?
我正在使用的VirtualPathProvider是当前将虚拟路径映射到解决方案外部的目录.我正在建立这个主要是为了自我锻炼.这完全等同于在解决方案目录中具有软链接或NTFS硬链接.
无论如何,我设法使用我的自定义提供程序从该虚拟目录成功加载静态图像.
现在的问题是浏览器不会缓存图像.并且服务器甚至不考虑返回缓存信息(如ETag).
这就是我所做的:
GetFile(path).Open()FileStream通过返回File.Open()GetCacheKey和GetCacheDependenciesGetFileHash返回Murmur哈希(似乎是最快的,甚至比CRC-32)并测试了它GetFileHash永远不会在我的提供程序中调用CTRL-F5ing仅返回以下标头(不引用缓存)
Cache-Control private
Content-Length 476
Content-Type image/png
Date Sat, 29 Dec 2012 21:25:54 GMT
Server Microsoft-IIS/8.0
X-AspNet-Version 4.0.30319
X-Powered-By ASP.NET
X-SourceFiles [...]
Run Code Online (Sandbox Code Playgroud)
我目前正在调试Visual Studio的调试服务器和配备Firebug的Firefox.
举个例子,这就是我的预期(http://i.stack.imgur.com/3mn3d.png)
Accept-Ranges bytes
Cache-Control max-age=315360000
Content-Length 1059
Content-Type image/png
Date Sat, 29 Dec 2012 21:35:29 GMT
Etag "7d636a8ef932ed081c16ace6f87b16e6"
Expires Fri, 12 Feb 2038 09:58:39 GMT
Last-Modified Tue, 14 Feb 2012 22:07:18 GMT
Server …Run Code Online (Sandbox Code Playgroud) 我可以用文件创建一个页面:
Page page = BuildManager.CreateInstanceFromVirtualPath(
virtualPath, typeof(Page)) as Page;
Run Code Online (Sandbox Code Playgroud)
如何从流或字符串中实例化页面?
谢谢.
asp.net ×4
asp.net-mvc ×4
c# ×2
precompiled ×2
.net ×1
caching ×1
iis ×1
iis-7 ×1
stream ×1
winapi ×1