问题标签 [virtualpathprovider]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2270 浏览

c# - 从流创建虚拟文件路径

我有一个关于 C# 和 Windows API 的一般性问题:

我的任务是从文档管理系统 (DMS) 加载文件并从该文件创建一个字节数组。从 DMS 的开发人员那里,我得到了一个 dll,它提供了这样的方法:

不幸的是,给定的 dll 没有为我提供将请求的文件作为字节数组或任何类型的流传递的方法。现在我的问题是,是否可以使用 C# 创建某种虚拟路径,而该虚拟路径实际上并不存在于辅助存储中。相反,写入此路径的所有位和字节都以流的形式转发给我?我的目的是提高性能,因为我不必将数据写入硬盘驱动器。

我已经搜索了很多,但实际上不知道我要查找的关键字。也许有人可以给我一个提示,或者只是告诉我这根本不可能。

0 投票
2 回答
1468 浏览

asp.net - HostingEnvironment.VirtualPathProvider.FileExists 在现有文件上返回 false

我正在尝试使用以下代码读取虚拟路径中的文件

_SiteMapFileName有类似“~/Content/en-US/MainMenu.sitemap”的东西,它总是返回false

但是,如果我访问该虚拟路径的 URL(http://www.local.mysite.com/Content/en-US/MainMenu.sitemap),该文件会在浏览器中正确显示

Content是我网站下的虚拟目录,指向不同位置的共享文件夹。如果我在 Windows 资源管理器上访问该位置,我可以正确查看文件

我已将站点和虚拟目录设置为我的网络帐户进行连接。

我使用进程监视器工具查看是否有任何问题,它说 w3wp.exe 正在尝试创建文件 \path\to\shared\location\Content\en-US\MainMenu.sitemap 但它正在获得ACCESS DENIED哪个很好,因为它是只读位置

现在有人如何解决这个问题吗?

0 投票
1 回答
134 浏览

asp.net - 如何让 VirtualPathProvider 包含页面演示者和界面文件?

我已经实现了一个从数据库中获取页面的 VirtualPathProvider。这适用于仅包含一个标记文件 (.aspx)、其代码文件 (.aspx.vb) 和母版页的简单应用程序。

然后,我将代码文件中的代码移动到演示者类中,该演示者类通过接口与页面及其后面的代码进行交互。

如何让我的 VirtualPathProvider 从数据库中获取要与页面一起编译的演示者和接口文件?

VPP 的 GetFile 方法仅针对页面、其代码隐藏页面和母版页调用。我不想使用 App_Code 目录(有效)。如果我为界面和演示者添加参考页面指令,则为这些调用 VPP 的 GetFile 方法,但我收到解析器错误消息:“文件'src'在这里无效,因为它没有公开类型。 " 如果我在页面的代码文件中包含类和交互定义,它就可以工作。

有没有办法让它们分开?

0 投票
1 回答
820 浏览

asp.net - 自定义 VirtualPathProvider 故障排除

我刚刚为我的 ASP.NET Web 应用程序创建了一个自定义的 VirtualPathProvider。它基本上将“~/Storage”和子目录中的所有虚拟文件映射到解决方案目录以外的目录。

代码要点

就我而言VirtualRootPath = "~/Storage",但它是可配置的。

问题

在 IIS Express 中,当我通过 Visual Studio 进行调试时,解析虚拟路径所需的两个公共方法并不总是被调用。

  • 调用http://localhost:7749/Storage会在两种方法上触发断点。返回并需要 404 错误。这对我来说是正确的行为
  • 调用http://localhost:7749/Storage/ExistingFile.txt不会触发调试,并返回不同的 404 错误。这是不正确的

两个 404 错误之间的区别在于,当我调用目录时,它是 ASP.NET 响应 ( Server error in application '/'),但是当我调用该目录中的文件时,它是 IIS 8.0 响应 ( HTTP Error 404.0 - Not Found)。

问题

为什么即使我VirtualPathProvider在我的 中正确注册了HostingEnvironmentIIS 8.0 也不让 ASP.NET 管道处理 HTTP 请求以便正确解析它?

解决方法

在阅读VirtualPathProvider 在 IIS 7.5 上的生产中没有(相当)工作后,我意识到这可能是一个Web.config问题。从另一个问题来看,IIS似乎独立处理某些文件扩展名,无论 ASP.NET 是否将这些文件扩展名映射到虚拟资源、控制器或其他任何东西。因此,由于我试图读取 XML 文件(可能不是 JPEG),IIS 并没有打扰 ASP.NET。

解决方法是将此行放在Web.config'ssystem.webServer.handlers部分:

但此解决方法仅适用于 XML 文件。如何对存储目录下的所有文件进行永久修复?

0 投票
0 回答
391 浏览

caching - 在 Web 场场景中使用 .NET MVC 4.0 VirtualPathProviders

我们有一个应用程序严重依赖于扩展 .NET System.Web.Hosting.VirtualPathProvider 架构的虚拟文件系统。我们使用链式搜索... (A)contentresourceprovider(扩展 virtualpathprovider) (B)assemblyresourceprovider (同上) (C)物理文件系统

vpp 像这样在应用程序初始化时注册...

这个问题与 ContentResourceProvider 相关(见下文)

基本上这一切都很好,每当我们通过我们的 cms 工具更新内容时,虚拟文件​​并从缓存中删除并重新打开/编译为剃刀视图。到目前为止一切都很好......但是我们最近将它部署到了一个服务器场,并且似乎整个固有的 System.Web.Hosting 虚拟文件提供程序无法扩展(显然)它与存储虚拟文件的特定服务器有关这意味着如果用户 A 通过 cms 工具对剃刀视图进行更改并且在服务器 A 上执行该操作,则用户 B 在服务器 B 上进行另一项更改将提供不希望的结果,尽管事实上内容来自同一个数据库。这是因为缓存剃刀视图的虚拟文件系统对于它们运行的​​ Web 服务器是唯一的,

我尝试过使用分布式缓存包,如 AppFabric、Memcached、NCache。这些还不够,因为它们依赖于您手动编写将序列化对象插入分布式缓存的代码。首先,.NET vpp 内存的东西在引擎盖下得到了有效的管理,并强制执行了严格的设计模式,而且 CacheDependency 类也不是可序列化的。

经过数小时的研究,我无法在网上找到解决方案。

当然,整个 .NET MVC 4.0 VirtualPathProvider/CacheDependency 系统架构必须有一种跨多台服务器扩展的方法?

我想根据我对此事的理解,我想问是否有办法在多个服务器上扩展 System.Web.Hosting 缓存内存,以便附加到这些文件的虚拟内容和缓存依赖项按预期工作?

任何帮助将不胜感激。

0 投票
1 回答
398 浏览

asp.net - 字节数组加载的程序集在 ascx 编译时出现问题(referencedAssemblies 不能包含 null)

我有一个解释起来有点复杂的问题(否则我不会有问题:)),但我会试一试。

我有一个 asp.net web 应用程序,我试图在运行时从另一个项目加载用户控件,而原始网站没有对包含用户控件的项目/dll 的引用。

当我知道所有需要的文件(dll 等.. 我可以让它工作)的路径时,尤其是对于 assembly.loadfile(Path)。但是现在我正在使用一个 virtualpathProvider 只能为我提供一个流。所以我不能再使用 assembly.loadfile(path) 了,但我必须使用 Assembly.load(byte[]) 。问题是,当切换到 assembly.load(byte[]) 时,我无法再编译 ascx 文件了。它给了我这个例外:

加载的程序集之间的唯一区别是属性 Location 给出了错误。我假设程序集的位置已传递给构建器。

有没有人可以就如何解决这个问题提供任何想法?(除了:将程序集写入磁盘上的临时文件夹)

我正在考虑我自己的 buildprovider 或这个方向的东西,但我担心我可能会遇到同样的问题。

最终这似乎是同一个问题: 从内存而不是磁盘向 CompilerParameters ReferencedAssemblies 提供程序集?

现在为了更好地理解,并可能帮助其他人:完整的堆栈跟踪和完整的源代码:

完整的堆栈跟踪

我有 2 个 web 应用程序,一个普通的,一个只有 ascx(usercontrol) 文件。

Web应用程序2:

这包含用户控件,仅此而已。

显示时间.ascx

在这里,我将程序集名称添加到 Inherits 值 => 否则应用程序将无法理解必须在不同的程序集中查找代码。

显示时间.ascx.vb

这就是此 Web 应用程序所需的全部内容。

Web应用程序1:

这里是魔法发生的地方

全球.asax

默认.aspx

这个有这个控制:

默认.aspx.vb

0 投票
1 回答
589 浏览

asp.net - 没有 VirtualPathProvider 的 MVC3 和虚拟视图

我有一个 MVC3 应用程序,我的视图内容很少以字符串形式保存在数据库中。现在我需要创建一个虚拟视图并将其返回给客户端。我读到这可以通过 VirtualPathProvider 来完成。但想知道这是否可以由 RazorViewEngine 完成。

EDIT1:我已按照此链接http://blog.rocketbase.co.uk/2011/04/asp-net-mvc-virtual-path-provider/中的建议使用了 VPP 。我在 global.asax 文件中注册了它。我有一个相当大的网络应用程序,它有许多实际存在于项目中的视图。因此,在 global.asax 中注册 VPP 后,我发现

  • Web 应用程序中的每个请求都通过此 VPP。无论是物理视图还是动态视图。那么这不会影响性能吗?我们不能通过跟踪 URL 来控制对 VPP 的调用吗?
  • 我的项目中也只有 .cshtml 文件,但 mvc 会尝试查找 .ascx、.aspx、.vbhtml 等文件。我再次觉得这会对性能产生负面影响。
0 投票
1 回答
408 浏览

asp.net - SharePoint - VirtualPathProvider:在 FeatureReceiver 中注册

我正在尝试为 SharePoint 2010/2013(服务器和基础)实现 VirtualPathProvider。到目前为止,我已经实现了和的子System.Web.Hosting.VirtualPathProvider类。System.Web.Hosting.VirtualFileSystem.Web.Hosting.VirtualDirectory

我想使用带有FeatureReceiver类的特性来向 HostingEnvironment 注册新的 VPP。但是由于我已经实施了这条线

HostingEnvironment.RegisterVirtualPathProvider(new MyVPProvider());

进入该FeatureActivated方法,VisualStudio 的调试部署失败:

Error occurred in deployment step 'Activate Features': Operation is not valid due to the current state of the object.

我不知道我做错了什么。也许 aFeatureReceiver是注册 VPP 的错误位置?

我已经在网上搜索了教程或示例,但没有找到合适的。非常感谢任何有关如何为 SharePoint 开发 VirtualPathProvider 的提示!提前致谢。

--

罗伯特·沃格尔

0 投票
1 回答
321 浏览

c# - 覆盖 VirtualPathProvider 的一些方法

我想使用 ASP.Net MVC Web 应用程序的默认实现的VirtualPathProvider

换句话说,我想从默认的 Asp.net VirtualPathProvider 继承我自己的 VirtualPathProvider 并覆盖GetCacheKey方法。

我应该怎么办?

任何人都可以帮忙吗?

干杯

0 投票
0 回答
282 浏览

c# - 在单独的 DLL 中使用 VirtualPathProvider

我正在编写一个应用程序,它需要我将 .aspx 页面嵌入到 dll 中。以前我有一个 httphandler 处理所有这些页面,并在代码中逐行构建它们。我了解到我实际上可以使用VirtualPathProvider来提供嵌入的内容。有了布局和我想要实现的目标,我遇到了一些麻烦。

我之前使用 httphandlers 的项目是解决方案中的一个 dll 项目和一个网站项目。除了 web.config 之外,网站项目完全是空的。对此的唯一更改是标准的 httphandler 部分将所有网站调用指向我的 dll 项目,然后如果该页面在我的 dll 中不存在,则该部分会提供它包含的页面或将请求传递回 IIS。

这就是我现在想要实现的目标,而是使用它VirtualPathProvider。我仍然不希望网站项目中的任何内容,但我似乎无法让 http 请求进入 dll 项目。我已经让 MSDN 示例在它自己的项目中完美运行(一切都在一个 Web 项目中),我想做的是将它们分开。

这甚至可能吗?我想是这样,但我在任何地方都找不到任何示例,每个人都想在一个项目中使用它而不是将它们分开。

这个想法是允许客户端进行最少的设置,第一个是通过将 dll 放在 Bin 目录中然后添加 3 行到 web.config 来安装的,就是这样。