IIS7 и ARR как обратный прокси для Подрывной деятельности

То, как Вы представляете набор, зависит полностью от того, как пользователи предназначаются для взаимодействия с ним.

1) , Если пользователи будут добавлять и удалять объекты из набора объекта, то простое свойство набора только добирания является лучшим (опция № 1 от исходного вопроса):

private readonly Collection myCollection_ = new ...;
public Collection MyCollection {
  get { return this.myCollection_; }
}

Эта стратегия используется для эти Items наборы на WindowsForms и средствах управления WPF ItemsControl, где пользователи добавляют и удаляют объекты, они хотят, чтобы управление отобразилось. Эти средства управления публикуют фактический набор и используют обратные вызовы или слушателей события для отслеживания объекты.

WPF также представляет некоторые устанавливаемые наборы, чтобы позволить пользователям отображать набор объектов, которыми они управляют, такой как ItemsSource свойство на ItemsControl (опция № 3 от исходного вопроса). Однако это не случай общего использования.


2) , Если пользователи будут только считывать данные, сохраняемые объектом, то можно использовать набор только для чтения, как [1 112] Увертливый предложенный:

private readonly List myPrivateCollection_ = new ...;
private ReadOnlyCollection myPrivateCollectionView_;
public ReadOnlyCollection MyCollection {
  get {
    if( this.myPrivateCollectionView_ == null ) { /* lazily initialize view */ }
    return this.myPrivateCollectionView_;
  }
}

Примечание, которое ReadOnlyCollection обеспечивает предпросмотр в реальном времени базового набора, таким образом, только необходимо создать представление однажды.

, Если внутренний набор не реализует IList, или если Вы хотите ограничить доступ к большему количеству опытных пользователей, можно вместо этого обернуть доступ к набору через перечислитель:

public IEnumerable MyCollection {
  get {
    foreach( T item in this.myPrivateCollection_ )
      yield return item;
  }
}

Этот подход прост реализовать и также предоставляет доступ всем участникам, не представляя внутренний набор. Однако это действительно требует, чтобы набор остался unmodfied, поскольку классы набора BCL выдадут исключение, при попытке перечислить набор после того, как это было изменено. Если базовый набор, вероятно, изменится, можно или создать легкую обертку, которая перечислит набор безопасно или возвратит копию набора.


3) Наконец, если необходимо представить массивы, а не высокоуровневые наборы, тогда необходимо возвратить копию массива, чтобы препятствовать тому, чтобы пользователи изменили его (опция № 2 от orginal вопроса):

private T[] myArray_;
public T[] GetMyArray( ) {
  T[] copy = new T[this.myArray_.Length];
  this.myArray_.CopyTo( copy, 0 );
  return copy;
  // Note: if you are using LINQ, calling the 'ToArray( )' 
  //  extension method will create a copy for you.
}

Вы не должны представлять основной массив через свойство, поскольку Вы не будете в состоянии сказать, когда пользователи изменят его. Чтобы позволить изменять массив, можно или добавить соответствие SetMyArray( T[] array ) метод или использовать пользовательский индексатор:

public T this[int index] {
  get { return this.myArray_[index]; }
  set {
    // TODO: validate new value; raise change event; etc.
    this.myArray_[index] = value;
  }
}

(конечно, путем реализации пользовательского индексатора, Вы будете копировать работу классов BCL:)

10
задан Paul Stovell 27 September 2009 в 12:57
поделиться

1 ответ

IIS7 has an applicationHost.config file which has a security section that limits file extensions:

<requestFiltering>
  <fileExtensions allowUnlisted="true" applyToWebDAV="true">
    <add fileExtension=".cs" allowed="false" />
    <add fileExtension=".csproj" allowed="false" />
    <add fileExtension=".vb" allowed="false" />
    <add fileExtension=".vbproj" allowed="false" />
    ....
  </fileExtensions>

More information:

http://learn.iis.net/page.aspx/143/how-to-use-request-filtering/

I added a similar section to my site's web.config and used a node to remove all extensions. Now I can serve .cs, .csproj files and others, but I cannot serve .config files yet.

Edit: Removing the hiddenSection nodes corrected this for web.config files too. Here is my local web.config file:

<system.webServer>
  <security>
    <requestFiltering>
      <fileExtensions allowUnlisted="true" applyToWebDAV="true">
        <clear />
      </fileExtensions>
      <verbs allowUnlisted="true" applyToWebDAV="true" />
      <hiddenSegments applyToWebDAV="true">
        <clear />
      </hiddenSegments>
    </requestFiltering>
  </security>
</system.webServer>
16
ответ дан 3 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: