我在IIS上托管具有以下结构的应用程序:
IISAPP
- bin
- plugins
- scripts
- default1.aspx
- web.config
在Plugins目录中,我在其自己的目录中托管了其他几个ASPX应用程序,因此结构如下所示:
IISAPP
- bin
- plugins
- MyPlugin
- bin
- scripts
- default2.aspx
- web.config
- scripts
- default1.aspx
- web.config
当我导航到http://IISAPP/时,将显示default1.aspx页面,这很棒。当我导航到http://IISAPP/plugins/MyPlugin/default2.aspx时,该页面未提供服务,并抱怨找不到该dll。这是因为插件应用程序正在bin文件夹顶级应用程序中查找dll。
我继续添加<probing privatePath="plugins/MyPlugin/bin" />
标签。这解决了提供default2.aspx的问题。
问题
这些插件将使用安装程序进行安装。我必须以某种方式更改该私有路径以包括所有文件夹。因此,如果我添加“ MyPlugin2”,则必须将顶级web.config中的探测标签修改为<probing privatePath="plugins/MyPlugin/bin;plugins/MyPlugin/bin" />
。
我需要使用C#在privatePath
部分的probing
元素的runtime
元素内的以下web.config中修改var config = System.Xml.Linq.XDocument.Load(System.Web.HttpContext.Current.Server.MapPath("~/Web.config"));
var runtimeNode = config.Root.Element("runtime").Element("assemblyBinding").Element("probing").Attribute("privatePath");
属性,然后保存配置文件。我尝试使用配置管理器来执行此操作,但是找不到正确的路径。看起来正确时,结果为空。
我也玩过以下游戏:
XMLDocument
在这种情况下,文档会加载,但是为了我的生命,我无法获取该privatepath值来更新它并保存配置。
我也尝试了var config = System.Xml.Linq.XDocument.Load(System.Web.HttpContext.Current.Server.MapPath("~/Web.config"));
System.Xml.Linq.XElement runtimeNode = config.Root.Element("runtime");
System.Xml.Linq.XElement assemblyBindingNode = runtimeNode.Element("assemblyBinding");
System.Xml.Linq.XElement probingNode = assemblyBindingNode.Element("probing");
System.Xml.Linq.XAttribute att = probingNode.Attribute("privatePath");
att.Value = "new value";
config.Save(System.Web.HttpContext.Current.Server.MapPath("~/Web.config.xml"));
,但是由于web.config中的第1行,我无法加载xml。我真的不想删除它,除此之外,该解决方案还有些草率。
更新 我尝试了以下方法:
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="MyProject.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<appSettings>
<add key="WebFilePath" value="D:\Web Solutions\WEB" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.6.2"/>
<httpRuntime targetFramework="4.5"/>
<httpModules>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/>
</httpModules>
</system.web>
<connectionStrings>
<add name="DB" connectionString="" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<remove name="ApplicationInsightsWebTracking"/>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler"/>
</modules>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
<probing privatePath="INeedToChangeThisValue" />
</assemblyBinding>
</runtime>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>
</compilers>
</system.codedom>
</configuration>
它可以运行到运行时节点。就像无法在运行时节点中找到AssemblyBinding节点一样。
web.config
-AsBool
答案 0 :(得分:0)
这似乎是xml名称空间问题,可以使用XmlDocument
来解决。
我唯一关心的是,通常ASP.Net会在启动时进行程序集解析,这意味着您可能需要在设置privatePath
(我使用过ConfigurationManager.RefreshSection("runtime")
)后重新启动应用程序,这可能会刷新该部分,并使一切正常。
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("~/web.config"));
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("ass", "urn:schemas-microsoft-com:asm.v1");
var probing = xmlDoc.SelectSingleNode("//runtime/ass:assemblyBinding/ass:probing", nsmgr) as XmlElement;
probing?.SetAttribute("privatePath", "bin;plugins/bin");
xmlDoc.Save(Server.MapPath("~/web.config"));
ConfigurationManager.RefreshSection("runtime");