ApplyWebConfigModifications在Farm中不起作用

时间:2008-12-09 15:53:44

标签: sharepoint web-config

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

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

SPWebConfigModification appSettingModification = new SPWebConfigModification();
appSettingModification.Name =“add [@key = \”Key \“] [@ value = \”Value \“]”;
appSettingModification.Path =“configuration / appSettings”;
appSettingModification.Owner =“所有者”;
appSettingModification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
appSettingModification.Value = __appSettingResource;

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

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

修改

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

使用此方法的一个问题是,即使实际未应用任何修改,也会在服务器场中更新所有web.config文件。即使您不打算更新Web配置,这也会导致应用程序池被回收。反思说明了为什么会发生这种情况并且非常烦人。

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

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

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

2 个答案:

答案 0 :(得分:0)

问题可能出在您对ApplyWebCOnfigModifications()的调用中,而不是:

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

使用:

app.Farm.Servers.GetValue <SPWebService&GT;()ApplyWebConfigModifications();

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

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

答案 1 :(得分: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();