如何在没有HttpContext的情况下使用bundle?

时间:2013-10-12 07:25:02

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

我想在其他环境中获取bundle的构建字符串,例如:HttpApplication start,Console application等。

但是当我打电话时

Scripts.Render("~/js").ToHtmlString()

将抛出异常:

Value cannot be null.
Parameter name: httpContext

如何模拟它以获得结果?

1 个答案:

答案 0 :(得分:1)

简答:不,如果没有httpContext,则无法使用Scripts.Render。但是,如果您愿意嘲笑它,可能会有一种解决方法(见下文)。

详细解答: 微软做出了一些不幸的设计决定。 我已经反编译了 System.Web.Optimization (V1.1.0.0)库(Microsoft.ASP.NET Web优化框架的一部分,通过NUGET提供)的Render方法,并找到了:{{ 1}}(在内部调用Scrips.Render)调用Scripts.RenderFormat以返回渲染结果。

该函数在内部使用Scripts.Manager.RenderExplicit(tagFormat, paths)来使用this.DeterminePathsToRender(paths)来解析路径。如果您看一下它,您会看到它使用this.ResolveVirtualPath(current)来解析路径:

this._httpContext

所以遗憾的是,围绕httpContext无法解决问题。 我想到的另一种方法是从类Scripts继承一个类myScriptClass,然后通过myScriptClass构造函数设置内部属性Context。但这也是不可能的,因为Scripts是一个静态类,你无法继承(详见this topic)。

但是您可以使用internal string ResolveVirtualPath(string virtualPath) { Uri uri; if (Uri.TryCreate(virtualPath, UriKind.Absolute, out uri)) { return virtualPath; } string arg = ""; if (this._httpContext.Request != null) { arg = this._httpContext.Request.AppRelativeCurrentExecutionFilePath; } return this.ResolveUrlMethod(arg, virtualPath); } 来获取或设置当前使用的HttpContext。

但是,如果您只能访问特定的 BundleContext.HttpContext 对象,那么您就没有选项,因为其 BundleCollection 属性是内部属性。

对于控制台应用程序,这意味着您可能必须创建一个假请求对象和HttpContext,在使用render方法之前必须将其分配给BundleContext.HttpContext。您可以查看 here there 以获取有关如何执行此操作的更多详细信息。