ApplyWebConfigModifications não trabalha na exploração agrícola

votos
1

Então, eu estou tentando implantar um recurso Aplicação Web que atualiza o web.config usando a coleção WebConfigModifications. Há muita informação sobre como fazer isso, incluindo todas as questões que você correr para isso estou muito confiante no código, mas não importa o que eu tento os elementos de configuração não são adicionados à configuração web. Isso funciona bem no ambiente de servidor único de desenvolvimento, mas não atualiza na Fazenda.

Sem erros, nenhuma informação log há mensagens de eventos .... nada apontando para por que ele não irá atualizar:

SPWebConfigModification appSettingModification = novo SPWebConfigModification ();
appSettingModification.Name = adicionar [@key = \ Key \ ] [@ value = \ Valor \ ];
appSettingModification.Path = configuração / appSettings;
appSettingModification.Owner = Proprietário;
appSettingModification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
appSettingModification.Value = __appSettingResource;

se (removeModification)
{
app.WebConfigModifications.Remove (appSettingModification);
}
Else
{
app.WebConfigModifications.Add (appSettingModification);
}
App.Update ();
app.Farm.Services.GetValue <SPWebService> ().

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

EDITAR

Eu queria acrescentar a isto com base em uma sugestão de Drax para refletir o método ApplyWebModifications. Este método é no SPWebService que está no espaço de nomes Microsoft.SharePoint.Administration na montagem Microsoft.SharePoint.

Um dos problemas com o uso deste método é que todos os arquivos web.config são atualizados na fazenda, mesmo se nenhuma modificação são efectivamente aplicadas. Isso faz com que os pools de aplicativos para serem reciclados, mesmo se você não pretende atualizar a configuração web. Reflexão mostra por que isso está acontecendo e é muito chato.

Dentro do método é um loop foreach curto:

foreach (aplicação SPWebApplication em this.WebApplications)
{
application.ApplyWebConfigModifications ();
}

É um loop através de cada uma das aplicações web e chamar um INTERNAS método ApplyWebConfigModifications sobre os objetos da aplicação web. Se eles apenas fizeram esse público método então nós seria capaz de chamar o método individualmente sem afetar a reciclagem do pool de aplicativo em aplicações web que não são afetados por nossas atualizações. Apenas dizendo'

Publicado 09/12/2008 em 16:53
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

problema é propably na sua chamada de ApplyWebCOnfigModifications () em vez de:

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

usar:

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

O segundo código realmente chama o serviço responsável por atualizar arquivos web.config.

Sidenote: Este código irá realmente abrir todos os arquivos webconfig em todos webapplications instalados no servidor / fazenda :) mas vai atualizar os apenas para a direita. Se você vai usar reflector para examinar este método você vai ver algum bom exemplo do uso de loop foreach :)

Respondeu 09/12/2008 em 17:30
fonte usuário

votos
0

Este problema é bug. Eu acho que.

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();
Respondeu 25/01/2011 em 01:44
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more