使用C#

时间:2019-01-04 09:44:58

标签: c# asp.net

我在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=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>
</configuration>

它可以运行到运行时节点。就像无法在运行时节点中找到AssemblyBinding节点一样。

web.config

-AsBool

1 个答案:

答案 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");