因此,我正在尝试部署使用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应用程序上的应用程序池回收。只是说'
答案 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();