1

そのため、WebConfigModifications コレクションを使用して web.config を更新する Web アプリケーション機能を展開しようとしています。あなたが遭遇したすべての問題を含め、これを行うことに関する多くの情報があるので、コードには非常に自信がありますが、何を試しても構成要素が Web 構成に追加されません。これは、開発用の単一サーバー環境では正常に機能しますが、ファームでは更新されません。

エラーなし、ログ情報なし、イベントメッセージなし....更新されない理由を示すものは何もありません:

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

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

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

編集

ApplyWebModifications メソッドを反映するという drax の提案に基づいて、これに追加したいと思いました。このメソッドは、Microsoft.SharePoint アセンブリの Microsoft.SharePoint.Administration 名前空間にある SPWebService にあります。

この方法を使用する際の問題の 1 つは、変更が実際に適用されていない場合でも、ファーム内のすべての web.config ファイルが更新されることです。これにより、Web 構成を更新するつもりがない場合でも、アプリ プールがリサイクルされます。反射は、なぜこれが起こっているのかを示しており、非常に迷惑です。

メソッド内には短い foreach ループがあります。

foreach (this.WebApplications 内の SPWebApplication アプリケーション)
{
application.ApplyWebConfigModifications();
}

各 Web アプリケーションをループし、Web アプリケーション オブジェクトでINTERNALの ApplyWebConfigModifications メソッドを呼び出しています。彼らがこのメソッドを公開しただけであれば、更新の影響を受けない Web アプリケーションでのアプリ プールのリサイクルに影響を与えることなく、メソッドを個別に呼び出すことができます。言ってるだけ'

4

2 に答える 2

0

問題は、次の代わりに、ApplyWebCOnfigModifications()の呼び出しに適切にあります。

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

使用する:

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

2番目のコードは、実際にはweb.configファイルの更新を担当するサービスを呼び出します。

補足: このコードは、サーバー/ファームにインストールされているすべてのWebアプリケーションのすべてのwebconfigファイルを実際に開きます:)が、適切なファイルを更新します。リフレクターを使用してこのメ​​ソッドをスキャンする場合は、foreachループを使用したいくつかの良い例が表示されます:)

于 2008-12-09T16:30:59.267 に答える
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();
于 2011-01-25T00:44:54.507 に答える