|
В начале года получил код dreamspark H4RQ9-QJ6FD-YJWJT-P6FVF-HGXQZ. При его вводе- сообщение что он просрочен.
|
Изучение архитектуры настроек ASP.NET
Данный обработчик проверяет, имеется ли свойство file=", а затем, если это свойство пустое, возвращает значение, основанное на вызове метода NameValueSectionHandler.CreateStatic(). Это метод, создающий объект конфигурации. Ниже приведен код NameValueSectionHandler.
//———————————————————————————––––––––––––——————
// <copyright file="NameValueSectionHandler.cs" company="Microsoft">
//
// Copyright (c) 2002 Microsoft Corporation All rights reserved.
// The use and distribution terms for this software are contained in the
// file named license.txt, which can be found in the root of this
// distribution. By using this software in any fashion, you are agreeing
// to be bound by the terms of this license
// You must not remove this notice, or any other, from this software.
//
// </copyright>
//——————————––––––––––––———————————————————————
#if !LIB
namespace System.Configuration {
using System.Collections;
using System.Collections.Specialized;
using System.Xml;
using System.Globalization;
public class NameValueSectionHandler :
IConfigurationSectionHandler {
const string defaultKeyAttribute = "key";
const string defaultValueAttribute = "value";
public object Create(object parent, object context,
XmlNode section) {
return CreateStatic(parent, section, KeyAttributeName,
ValueAttributeName);
}
internal static object CreateStatic(object parent,
XmlNode section) {
return CreateStatic(parent, section, defaultKeyAttribute,
defaultValueAttribute);
}
internal static object CreateStatic(object parent, XmlNode
section, string keyAttriuteName, string valueAttributeName)
{
ReadOnlyNameValueCollection result;
// start result off as a shallow clone of the parent
if (parent == null)
result = new ReadOnlyNameValueCollection(new
CaseInsensitiveHashCodeProvider(
CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(
CultureInfo.InvariantCulture));
else {
ReadOnlyNameValueCollection parentCollection =
(ReadOnlyNameValueCollection)parent;
result =
new ReadOnlyNameValueCollection(parentCollection);
}
// process XML
HandlerBase.CheckForUnrecognizedAttributes(section);
foreach (XmlNode child in section.ChildNodes) {
// skip whitespace and comments
if (HandlerBase.IsIgnorableAlsoCheckForNonElement(
child))
continue;
// handle <set>, <remove>, <clear> tags
if (child.Name == "add") {
String key = HandlerBase.RemoveRequiredAttribute(
child, keyAttriuteName);
String value = HandlerBase.RemoveRequiredAttribute(
child, valueAttributeName, true
/*allowEmptyString*/);
HandlerBase.CheckForUnrecognizedAttributes(child);
result[key] = value;
}
else if (child.Name == "remove") {
String key = HandlerBase.RemoveRequiredAttribute(
child, keyAttriuteName);
HandlerBase.CheckForUnrecognizedAttributes(child);
result.Remove(key);
}
else if (child.Name.Equals("clear")) {
HandlerBase.CheckForUnrecognizedAttributes(child);
result.Clear(); }
else {
HandlerBase.ThrowUnrecognizedElement(child);
}
}
result.SetReadOnly();
return result;
}
protected virtual string KeyAttributeName {
get { return defaultKeyAttribute;}
}
protected virtual string ValueAttributeName {
get { return defaultValueAttribute;}
}
}
}
#endifДанный код создает объект коллекции настроек, содержащий пары различных ключей и значений из раздела настроек <appSettings>. Я не буду тратить много времени на объяснение кода обработчика, но давайте рассмотрим несколько наиболее важных пар. Метод CreateStatic() вызывается из первого обработчика раздела и создает объект конфигурации ReadOnlyNameValueCollection, который будет хранить всю информацию о парах различных ключей и значений. Давайте посмотрим на код, который используется для разбора XML.
if (child.Name == "add") {
String key = HandlerBase.RemoveRequiredAttribute(child,
keyAttriuteName);
String value = HandlerBase.RemoveRequiredAttribute(child,
valueAttributeName, true/*allowEmptyString*/);
HandlerBase.CheckForUnrecognizedAttributes(child);
result[key] = value;
}Если имя дочернего элемента XML равно " add ", то этот код добавляет в объект типа ReadOnlyNameValueCollection с именем result пару ключ/значение. Когда вы в своем коде ссылаетесь на коллекцию <appSettings>, то осуществляете доступ к этой коллекции и обращаетесь к значениям, сохраненным в этом разделе.
Обработчики разделов настроек интерпретируют все параметры из конкретных разделов и делают их доступными для приложений. В "Создание собственных параметров" описывется, как создавать собственные обработчики разделов настроек для интерпретации параметров из собственных разделов.
Ключевые моменты
- Иерархическая модель настроек организует различные виды наследования от сервера к приложению и от одного приложения к другому. Это наследование основано на URL, который используется для доступа к требуемому ресурсу.
- Для указания того, что настроечные параметры относятся к конкретной директории или даже одному файлу, используется тег location.
- Для запрета переопределение параметров другими файлами web.config используется параметр allowOverride.
- Обработчики разделов настроек делают настройки конфигурации доступными для приложений, обрабатывая XML и возвращая объект конфигурации.