获取没有HttpContext的特定包中文件的路径列表

时间:2018-01-09 17:28:22

标签: c# asp.net asp.net-mvc asp.net-web-api

我有一个基于Web Api的应用程序。 ApiController中有一个方法,可以通过Http-request调用,通过Hangfire处理程序。

问题是我需要获取特定包的文件路径列表,但是我找不到如何做到这一点的正确方法。如果我有HttpContext,我有一个解决方案:

   var httpContext = new HttpContextWrapper(HttpContext.Current);
   var reportScripts = registeredBundles.First((b) => b.Path == "~/bundles/report");

   BundleContext bundleContext = new BundleContext(httpContext, BundleTable.Bundles, "~/bundles/");
   var filePath = reportScripts.EnumerateFiles(bundleContext).First().IncludedVirtualPath;

但是,如果Hanfire调用我的方法,我根本就没有HttpContext。所以上面的方法不起作用。我找到了一个解决方法herehere(只是为了模拟HttpContext)。但这个解决方案对我来说看起来很奇怪......我不会用它。

有人可以帮我找到从特定捆绑中获取路径列表的方法吗?我很惊讶为什么Bundle对象有内部字段“Items”,但不是公共字段。

如果我的解释不够明确,请详细说明: 例如,我有一个包:

            bundles.Add(new ScriptBundle("~/bundles/report")
            .Include("~/Scripts/d3js/d3.min.js")
            .Include("~/Scripts/jquery/jquery-1.12.4.js"));

我需要从那里获取字符串“Scripts / d3js / d3.min.js”。

这对我来说是必要的,因为我在服务器端呈现复杂的报告并将其发送给客户。对于报告的模板,我需要一些脚本的链接(即Jquery等)。我不想使用任何常量和硬编码路径到我的脚本,因为我可以在将来更改脚本或文件的版本。在这种情况下,我的报告将被打破。在捆绑包中,我将始终拥有最新版本的脚本,因此如果我可以从捆绑包中获取路径,那将是完美的!

提前致谢!

2 个答案:

答案 0 :(得分:1)

捆绑包的重点是应用程序不再提供单个文件 - 它提供从单个文件创建的捆绑包。这样做的结果是,从客户端的角度来看,这会模糊哪些文件进入捆绑包。

这很有道理,因为如果你为客户端提供一个包含两个函数的文件,他们就不关心或者不需要知道你的源代码是将这些函数存储在一个或两个文件中。在模糊的意义上,它就像询问有多少C#源代码文件用于编译用于服务任何给定请求的类。

我能给出的最佳建议是在报告上显示捆绑包URL,并提供一些额外的文档,告诉客户如果他们真的想知道该捆绑包中的内容。

答案 1 :(得分:0)

  1. 添加

    使用 System.Web.Optimization;

  2. 使用

    枚举包含的脚本

    BundleResolver.Current.GetBundleContents(bundleUrl);