DotNetNuke 6 Манифест | Компонент конфигурации - PullRequest
1 голос
/ 06 декабря 2011

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

В частности, я добавляю ссылку на веб-сервис в манифесте так:

<component type="Config">
      <config>
        <configFile>web.config</configFile>
        <install>
          <configuration>
            <nodes>
              <node path="/configuration" action="update" collision="ignore">
                <system.serviceModel>
                  <bindings>
                    <basicHttpBinding>
                      <binding name="xxx">
                      </binding>
                    </basicHttpBinding>
                  </bindings>
                  <client>
                    <endpoint address="http://xxx" binding="basicHttpBinding" bindingConfiguration="xxx" contract="xxx" name="xxx" />
                  </client>
                </system.serviceModel>
              </node>
            </nodes>
          </configuration>
        </install>
      </config>
    </component>

Раздел добавляется в файл web.config, даже если в файле уже есть один из этих блоков. Что я делаю не так?

Ура!

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

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

Прежде всего, ваш пример только пытается избежать столкновения с элементом / configuration, который есть в каждом файле web.config..

Далее вам нужно выделить каждую часть - это важно и для удаления.

В вашем примере у вас есть несколько уровней - <system.servicemodel> , <bindings>, <basicHttpBinding> и т. Д.

То, что вам нужно сделать, это разделить их независимо друг от друга, чтобы их можно было идентифицировать по «ключу» каждого элемента (то есть имени, адреса - что бы это ни было).Это позволяет механизму слияния идентифицировать столкновение и выполнить обновление.

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

<component type="Config">
  <config>
    <configFile>web.config</configFile>
    <install>
      <configuration>
        <nodes>
          <node path="/configuration" targetpath="/configuration/system.serviceModel" action="update" collision="ignore">
            <system.serviceModel>
              <bindings>
                 <basicHttpBinding>
                 </basicHttpBinding>
              </bindings>
              <client>
              </client>
            </system.serviceModel>
          </node>
          <node path="/configuration/system.serviceModel/bindings/basicHttpBinding" action="update" key="name" collision="overwrite">
              <binding name="xxx">
              </binding>
          </node>
          <node path="/configuration/system.serviceModel/client" action="update" key="address" collision="overwrite">
             <endpoint address="http://xxx" binding="basicHttpBinding" bindingConfiguration="xxx" contract="xxx" name="xxx" />
          </node>
        </nodes>
      </configuration>
    </install>
  </config>
</component>

Edit: Атрибут targetpath должен быть написан в нижнем регистре, иначе установщик будетсоздавать дубликаты элементов.(Оригинальный ответ: targetPath)

3 голосов
/ 09 марта 2012

У меня была такая же проблема, и она была исправлена ​​добавлением тега удаления.Это означает, что этот код должен работать:

<component type="Config">
  <config>
    <configFile>web.config</configFile>
    <install>
      <configuration>
        <nodes>
          <node path="/configuration" action="update" collision="overwrite">
            <system.serviceModel>
              <bindings>
                <basicHttpBinding>
                  <binding name="xxx">
                  </binding>
                </basicHttpBinding>
              </bindings>
              <client>
                <endpoint address="http://xxx" binding="basicHttpBinding" bindingConfiguration="xxx" contract="xxx" name="xxx" />
              </client>
            </system.serviceModel>
          </node>
        </nodes>
      </configuration>
    </install>
    <uninstall>
      <configuration>
         <nodes>
         </nodes>
      </configuration>
    </uninstall>
  </config>
</component>

, и вам нужно добавить каждый уровень отдельно, как сказал Брюс Чепмен

0 голосов
/ 06 декабря 2011

Попробуйте изменить коллизию, чтобы перезаписать вместо игнорирования

ex:

 <component type="Config">
     <config>
       <configFile>web.config</configFile>
       <install>
         <configuration>
           <nodes>
             <node path="/configuration/dotnetnuke/sitemap/providers" action="update" key="name" collision="overwrite">
               <add name="DNNSimpleArticleSiteMapProvider" type="DotNetNuke.Modules.dnnsimplearticle.Providers.Sitemap.Sitemap, DNNSimpleArticle" providerPath="~\DesktopModules\dnnsimplearticle\Providers\Sitemap\" />
             </node>
           </nodes>
         </configuration>
       </install>
       <uninstall>
         <configuration>
           <nodes />
         </configuration>
       </uninstall>
     </config>
   </component>
...