1

因此,我正在尝试部署一个使用 WebConfigModifications 集合更新 web.config 的 Web 应用程序功能。有很多关于执行此操作的信息,包括您遇到的所有问题,因此我对代码非常有信心,但无论我尝试什么,配置元素都不会添加到 Web 配置中。这在开发单服务器环境中工作正常,但在 Farm 中不会更新。

没有错误,没有日志信息,没有事件消息....没有任何指向为什么它不会更新:

SPWebConfigModification appSettingModification = new SPWebConfigModification();
appSettingModification.Name = "添加[@key=\"Key\"][@value=\"Value\"]";
appSettingModification.Path = "配置/应用设置";
appSettingModification.Owner = "所有者";
appSettingModification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
appSettingModification.Value = __appSettingResource;

if (removeModification)
{
app.WebConfigModifications.Remove(appSettingModification);
}
else
{
app.WebConfigModifications.Add(appSettingModification);
}
app.Update();
app.Farm.Services.GetValue<SPWebService>()。

===============================

编辑

我想根据 drax 的建议添加此内容以反映 ApplyWebModifications 方法。此方法位于 Microsoft.SharePoint 程序集的 Microsoft.SharePoint.Administration 命名空间中的 SPWebService 上。

使用此方法的问题之一是所有 web.config 文件都在场中更新,即使实际上没有应用任何修改。即使您不打算更新 Web 配置,这也会导致应用程序池被回收。反思表明为什么会发生这种情况,这很烦人。

该方法内部是一个简短的 foreach 循环:

foreach(this.WebApplications 中的 SPWebApplication 应用程序)
{
application.ApplyWebConfigModifications();
}

它循环遍历每个 Web 应用程序并在 Web 应用程序对象上调用INTERNAL ApplyWebConfigModifications 方法。如果他们只是将此方法公开,那么我们将能够单独调用该方法,而不会影响不受我们更新影响的 Web 应用程序上的应用程序池回收。只是在说'

4

2 回答 2

0

问题可能在于您调用 ApplyWebCONfigModifications() 而不是:

app.Farm.Services.GetValue().ApplyWebConfigModifications();

采用:

app.Farm.Servers.GetValue <SPWebService>().ApplyWebConfigModifications();

第二个代码实际上调用了负责更新 web.config 文件的服务。

旁注: 此代码实际上将打开服务器/农场上安装的所有 web 应用程序中的所有 webconfig 文件 :) 但它会更新正确的文件。如果您将使用反射器扫描此方法,您将看到一些使用 foreach 循环的好例子:)

于 2008-12-09T16:30:59.267 回答
0

这个问题是bug。我认为。

SPWebService.ApplyWebConfigModifications()

public void ApplyWebConfigModifications()
{
  if (base.Farm.TimerService.Instances.Count > 1)
  {
    SPWebConfigJobDefinition definition = new SPWebConfigJobDefinition(this);
    definition.Schedule = new SPOneTimeSchedule(DateTime.Now);
    try
    {
      definition.Update();
      return;
    }
    catch (Exception exception)
    {
      if (exception is SPDuplicateObjectException)
      {
        throw new InvalidOperationException(SPResource.GetString("WebconfigModificationAlreadyRunning", new object[0]), exception);
      }
      throw;
    }
  }
  string strMessage = string.Empty;
  **foreach (SPWebApplication application in this.WebApplications)**
  {
    ULS.SendTraceTag(0x38386866, ULSCat.msoulscat_WSS_Topology, ULSTraceLevel.Medium, "Apply web config modifications to web app {0} ", new object[] { application.GetResponseUri(SPUrlZone.Default).ToString() });
    try
    {
      application.ApplyWebConfigModifications();
于 2011-01-25T00:44:54.507 回答