#asp.net #iis-7 #asp.net-3.5
#asp.net #iis-7 #asp.net-3.5
Вопрос:
Я работаю над большим ASP.NET проект (мы используем ASP.NET 3.5), который состоял из 5 разных веб-сайтов и некоторых общих сборок. Недавно я добавил пользовательский раздел в web.config
файлы для каждого сайта. Когда я развертываю все эти приложения, каждый сайт развертывается отдельно в том же пуле приложений. Есть ли какой-либо способ сделать этот раздел доступным для редактирования в IIS на уровне сайта, точно так же, как вы можете редактировать ConnectionString
раздел для каждого сайта?
Все добавленные мной разделы выглядят следующим образом:
<sectionGroup name="RegistriesCustomSettings">
<section name="RegistriesSettings"
type="Registries.Business.Utilities.RegistriesConfigurations"/>
</sectionGroup >
<RegistriesCustomSettings>
<RegistriesSettings ContextCommandTimeout="30"
logLinq="true" DisplayUser="true" BaseReportPath="/DDD/"
ReportingServer="http://patriot-regdev:8000/ReportServer"
TopInstitution="1000001" />
</RegistriesCustomSettings>
Мы используем IIS 7.0, 2008 RC 2.
Комментарии:
1. @victor — прошу прощения, несколько (давно просроченных) выходных и напряженный график работы прямо сейчас не дали мне много времени для дальнейшего изучения этого вопроса.
2. @kev — вообще никаких проблем, безумный график работы звучит очень знакомо, надеюсь, вы не слишком напрягались. У меня есть некоторые дополнительные наблюдения / выводы (см. Мой следующий вопрос), поэтому, когда у вас появится возможность вернуться к этой проблеме, я дам вам знать.
3. @victor — Я поднял этот вопрос на форумах MS IIS, надеюсь, инженер Microsoft, такой как @CarlosAg, заметит :). forums.iis.net/t/1178006.aspx
4. @kev — забавно, что я тоже там разместил forums.iis.net/t/1178021.aspx но вы сформулировали это лучше, поэтому я, вероятно, удалю свой. Конечно, я дам вам знать, если получу какой-либо ответ до этого. Еще раз спасибо за всю помощь.
5. @kev — кстати, я видел несколько примеров, когда добавленный пользовательский раздел помещался внутрь
system.web
. Я не думаю, что проблема в этом, но могу попробовать.
Ответ №1:
Да, есть способ сделать это, расширив схему конфигурации IIS.
-
Создайте файл с именем
RegistriesSchema.xml
и скопируйте и вставьте следующий XML:<configSchema> <sectionSchema name="RegistriesCustomSettings"> <element name="RegistriesSettings"> <attribute name="ContextCommandTimeout" type="int" validationType="integerRange" validationParameter="1,600" allowInfinite="true" defaultValue="30" /> <attribute name="logLinq" type="bool" defaultValue="True" /> <attribute name="DisplayUser" type="bool" defaultValue="True" /> <attribute name="BaseReportPath" type="string" validationType="nonEmptyString" /> <attribute name="ReportingServer" type="string" validationType="nonEmptyString" /> <attribute name="TopInstitution" type="string" validationType="nonEmptyString" /> </element> </sectionSchema> </configSchema>
-
Возьмите копию инструмента под названием
IisSchema.exe
отсюда:IISSCHEMA.EXE — Инструмент для регистрации разделов конфигурации IIS7
Распакуйте архив и убедитесь, что exe-файл и файл xml-схемы находятся в одной папке.
-
Из командной строки администратора (т.е. открыть
cmd.exe
с помощью «Запуск от имени администратора»):IISSCHEMA.EXE /установить RegistriesSchema.xml
Это приведет к двум вещам:
- удаляет файл схемы в
%systemroot%system32inetsrvconfigschema
-
добавляет следующий XML в
applicationHost.config
:<название раздела="RegistriesCustomSettings" overrideModeDefault="Разрешить" allowDefinition="Везде" />
- удаляет файл схемы в
4. Запустите IIS Manager и откройте настройки функций для вашего веб-сайта, а также откройте редактор конфигурации:
5. Выберите раздел из выпадающего списка:
Если все в порядке, вы должны увидеть «RegistriesCustomSettings», выберите этот пункт.
6. Теперь вы можете редактировать эти настройки, и они будут добавлены в web.config
файл вашего сайта:
Это всего лишь демонстрация, поэтому настройки схемы могут быть не совсем правильными и, вероятно, потребуется некоторая тонкая настройка.
Что делать с <sectionGroup name="RegistriesCustomSettings">
?:
Вам все равно нужно будет добавить configSection/sectionGroup
xml в ваш web.config
файл для каждого сайта или вы можете добавить его в корневой machine.config
файл для любой версии ASP.NET вы используете, т.е.:
Для .NET Framework 2.0 (который также применяется к .NET3.0 и 3.5):
%systemroot%Microsoft.NETFramework v2.050727CONFIGmachine.config
%systemroot%Microsoft.NETFramework64v2.050727CONFIGmachine.config
Для .NET Framework 4.0:
%systemroot%Microsoft.NETFrameworkv4.0.30319CONFIGmachine.config
%systemroot%Microsoft.NETFramework64v4.0.30319CONFIGmachine.config
Если вы поместите свою сборку configSection/sectionGroup
в свои machine.config
файлы, вам не нужно объявлять ее на каждом сайте web.config
. Если довольно много сайтов будут использовать эту сборку, то это может быть хорошей экономией времени.
Обновить:
Похоже, что в редакторе конфигурации IIS7.5 есть ошибка или ограничение. Похоже, что если у вас есть собственные пользовательские объявления configSections
<sectionGroup>
or <section>
в web.config
файле вашего сайта, это нарушает работу редактора конфигурации IIS7.5. Я пытаюсь разобраться в этом:
Обновление 2:
Я думаю, что документы MS по этому вопросу немного фальшивые, особенно там, где ваш пользовательский раздел конфигурации должен быть доступен с помощью ASP.NET и доступен для редактирования в редакторе конфигурации IIS Manager. Хитрость, по-видимому, заключается в том, чтобы объявить схему следующим образом в RegistriesSchema.xml
файле:
<configSchema>
<sectionSchema name="RegistriesCustomSettings/RegistriesSettings">
<attribute name="ContextCommandTimeout"
type="int"
validationType="integerRange"
validationParameter="1,600"
allowInfinite="true"
defaultValue="30" />
<attribute name="logLinq"
type="bool"
defaultValue="True" />
<attribute name="DisplayUser"
type="bool"
defaultValue="True" />
<attribute name="BaseReportPath"
type="string"
validationType="nonEmptyString" />
<attribute name="ReportingServer"
type="string"
validationType="nonEmptyString" />
<attribute name="TopInstitution"
type="string"
validationType="nonEmptyString" />
</sectionSchema>
</configSchema>
Кроме того, и это важно, удалите ссылку на раздел из applicationHost.config
:
<section name="RegistriesCustomSettings"
overrideModeDefault="Allow"
allowDefinition="Everywhere" />
Это не требуется.
Кроме того, вам на самом деле не нужно использовать iisschema.exe
инструмент, просто возьмите копию NotePad2 (это 64-разрядный редактор, он нужен вам для редактирования чего-либо inetsrvconfig
) и создайте RegistriesSchema.xml
файл непосредственно в inetsrvconfigschema
.
Вы можете узнать больше о расширении схемы IIS7 здесь:
Расширение схемы IIS 7.0 и доступ к пользовательским разделам с помощью MWA
Вы можете просмотреть существующие файлы схемы, чтобы узнать больше о том, как создать эти параметры. Их можно найти в:
%systemroot%system32inetsrvconfigschema
Предостережение: Приведенный выше пример был протестирован на IIS7.5 x64 RTM в Windows 7 x64 Ultimate. Вы упомянули, что используете версию-кандидат, поэтому ваш пробег может отличаться из-за этого.
Комментарии:
1. Большое спасибо за такой подробный ответ и правки моего поста. Я попробую это завтра. После более тщательного изучения мы используем IIS 7.0, интегрированный в Windows 2008 с пакетом обновления 2 x32. Должно ли это иметь какое-либо заметное значение?
2. Не должно иметь большого значения, инструмент IISSchema был написан, когда RTM 2008 был либо в бета-версии, либо только что выпущен.
3. что касается настроек схемы, есть ли место, где я могу найти список всех настроек?
4. странно, я успешно запустил пользовательский инструмент, и он удалил новую схему и добавил раздел в файл applicationHost.config, но раздел не отображается как редактируемый в папке приложения. Нужно ли сделать что-нибудь еще?
5. @victor — когда вы говорите «не отображается как редактируемое в папке приложения» — можете ли вы расширить?