2008-12-09 2 views
1

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

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

SPWebConfigModification appSettingModification = новый SPWebConfigModification();
appSettingModification.Name = "Добавить [@key = \" Key \ "] [@ value = \" Value \ "]";
appSettingModification.Path = "configuration/appSettings";
appSettingModification.Owner = "Owner";
appSettingModification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
appSettingModification.Value = __appSettingResource;

, если (removeModification)
{
app.WebConfigModifications.Remove (appSettingModification);
}
еще
{
app.WebConfigModifications.Add (appSettingModification);
}
приложение.Обновление();
app.Farm.Services.GetValue <SPWebService>() .ApplyWebConfigModifications();

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

EDIT

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

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

Внутри метода является коротким циклом Еогеаспа:

Еогеаспа (приложение SPWebApplication в this.WebApplications)
{
application.ApplyWebConfigModifications();
}

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

+0

FYI, вы можете вызвать внутренние, защищенные и приватные методы, используя API-интерфейсы .NET Reflection. Прошло некоторое время с тех пор, как я должен был это сделать, но вот что произошло с быстрым поиском google [http://breakingdotnet.blogspot.com/2010/10/invoke-private-internal-method-with.html] (http://breakingdotnet.blogspot.com/2010/10/invoke-private-internal-method-with.html) – BrainSlugs83 2011-09-16 21:29:19

ответ

0

проблема является Propably в вашем вызове ApplyWebCOnfigModifications() вместо:

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

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

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

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

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

+0

На самом деле у меня был , но я забыл HTML. Кодировать его в вопросе, чтобы он не объявиться. Оказывается, это была моя проблема. – webwires 2008-12-09 19:50:02

0

Эта проблема является ошибкой. Я думаю.

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();