有没有办法让多个IIS虚拟目录(应用程序)共享第三方组件DLL的单个副本?
我们有一组15-20个相关的ASP.NET应用程序(wwwroot的子目录,定义为IIS中的虚拟目录或应用程序),它们都运行在同一个网站上(基于根目录或wwwroot).环境是.NET 4.0.
通常,当我们使用第三方组件时,我们会将其添加到单个应用程序中,该应用程序通常会在web.config中添加一些条目,并将组件DLL文件复制到该应用程序中的bin文件夹以进行部署.如果在网站中的多个应用程序中使用相同的组件,则需要将组件DLL复制到每个应用程序(虚拟目录)中的bin文件夹中.当只有几个DLL时,这很好.
我们最近购买并开始使用供应商的ASP.NET组件集合(网格,图表等).如果我们在每个应用程序中使用几乎完整的组件套件,则需要将100MB或更多的DLL文件复制到每个应用程序中.即使我们只使用合理的组件子集,每个应用程序仍然可能是30-50MB.
我一直试图找到一种方法让每个应用程序使用可能安装在根目录中的组件DLL的单个共享副本.
我认为,理想的方法是在每台服务器上安装GAC(全局程序集缓存)中的组件,但这在我们的生产服务器环境中是不允许的.
我查看了"探测私有路径"选项,但这只允许从应用程序的子文件夹加载程序集.
我查看了"codeBase"选项,这似乎几乎使它成为可能,但并不完全.
我将其中一个组件DLL复制到C:\ Inetpub\wwwroot\bin,然后在子应用程序中向web.config添加了一个部分,类似于:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="COMPONENT-NAME" version="1.2.3.4" culture="neutral" publicKeyToken="NNNN"/>
<codeBase version="1.2.3.4" href="http://SERVERNAME/bin/COMPONENT-NAME.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)
其中name,version,publicKeyToken和文件名特定于我尝试使用的组件.
我还在子应用程序的web.config文件下面有相应的"添加程序集"部分.
尝试使用该组件运行子应用程序不起作用,因为IIS禁止"bin"文件夹作为URL可见(提供).
我将DLL移动到C:\ Inetpub\wwwroot\components并更改了codeBase的href属性以匹配.然后我收到此错误:此appdomain已禁用程序集的HTTP下载.(来自HRESULT的异常:0x80131048)有些搜索似乎表明这种限制内置于ASP.NET中,并且无法合理地进行更改.
然后我尝试将codeBase标记中的href更改为绝对文件路径,类似于:
<codeBase version="1.2.3.4" href="file://C:\Inetpub\wwwroot\components\COMPONENT-NAME.dll"/>
Run Code Online (Sandbox Code Playgroud)
这成功了,并允许子应用程序使用该组件运行和加载页面.
但是,我不喜欢使用这种方法,因为它依赖于操作系统中的绝对物理文件路径.此文件路径在开发,登台,测试和生产服务器中不同.我可以通过向每个环境发布不同的web.config文件来管理它,但这会增加部署错误的工作和风险.此外,由于我们的团队不拥有或控制生产服务器,因此无法保证我们网站的物理文件路径始终保持不变.
是否有任何实用的方法在网站中的所有chld应用程序之间共享组件DLL的单个副本,或者我只需要继续将DLL复制到每个应用程序中的bin文件夹中?
| 归档时间: |
|
| 查看次数: |
1543 次 |
| 最近记录: |