ApplyWebConfigModification не работает в ферме - PullRequest
1 голос
/ 09 декабря 2008

Итак, я пытаюсь развернуть функцию веб-приложения, которая обновляет файл web.config с использованием коллекции WebConfigModifications. Есть много информации об этом, включая все проблемы, с которыми вы столкнулись, поэтому я очень уверен в коде, но, что бы я ни пытался, элементы конфигурации не добавляются в веб-конфигурацию. Это прекрасно работает в среде с одним сервером разработки, но не обновляется в ферме.

Нет ошибок, нет данных журнала, нет сообщений о событиях .... ничего не указывает на то, почему он не будет обновляться:

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.WebConfigModification.Remove (appSettingModification);
}
еще
{
app.WebConfigModification.Add (appSettingModification);
}
app.Update ();
app.Farm.Services.GetValue () ApplyWebConfigModifications ().

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

EDIT

Я хотел бы добавить к этому, основываясь на предложении drax, чтобы отразить метод ApplyWebModification. Этот метод используется в SPWebService, который находится в пространстве имен Microsoft.SharePoint.Administration в сборке Microsoft.SharePoint.

Одна из проблем, связанных с использованием этого метода, заключается в том, что все файлы web.config обновляются в ферме, даже если на самом деле не применяются никакие изменения. Это приводит к перезапуску пулов приложений, даже если вы не собираетесь обновлять веб-конфигурацию. Отражение показывает, почему это происходит, и это очень раздражает.

Внутри метода есть короткий цикл foreach:

foreach (приложение SPWebApplication в этом. WebApplications)
{
application.ApplyWebConfigModifications ();
}

Он проходит по каждому веб-приложению и вызывает ВНУТРЕННИЙ Метод ApplyWebConfigModification для объектов веб-приложения. Если бы они просто сделали этот метод общедоступным, мы бы могли вызывать этот метод по отдельности, не затрагивая перезапуск пула приложений в веб-приложениях, на которые не влияют наши обновления. Просто скажи

Ответы [ 2 ]

0 голосов
/ 25 января 2011

Эта проблема - ошибка. Я думаю.

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();
0 голосов
/ 09 декабря 2008

проблема, вероятно, в вашем вызове ApplyWebCOnfigModification () вместо:

.

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

использование:

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

Второй код фактически вызывает службу, ответственную за обновление файлов web.config.

Sidenote: Этот код фактически откроет все файлы webconfig во всех веб-приложениях, установленных на сервере / ферме :), но обновит только правильные. Если вы будете использовать отражатель для сканирования этого метода, вы увидите хороший пример использования цикла foreach:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...