Правила безопасности для создания подклассов прозрачного типа с помощью конструктора безопасного критического уровня в Silverlight - PullRequest
3 голосов
/ 08 июля 2011

В модели безопасности Silverlight (v4.0) Шон Фаркас говорит о производных от типов:

[...] мы видим, что типы приложений могут быть получены только из другие типы приложений или прозрачные типы платформ. (*)

* Часть этого:

(*) Это верно в 99,9% случаев. Есть еще одно правило о видимости конструктора класса по умолчанию (которое мы рассмотрим на следующей неделе, когда углубимся в модель безопасности), которое также требует, чтобы конструктор по умолчанию базового класса (если он есть) должно быть прозрачным. Практически говоря, вы обычно не найдете интересных прозрачных типов в платформе, которые также не имеют прозрачных конструкторов по умолчанию, поэтому это правило обычно не вступает в игру.

Однако существует один такой интересный прозрачный тип, у которого нет прозрачного конструктора по умолчанию - класс WebClient. Есть также веская причина хотеть подклассировать его - переопределить GetWebRequest для обеспечения поддержки файлов cookie.

В качестве теста я попробовал следующее с атрибутом конструктора и без него ...

public class MyWebClient : WebClient
{
    [SecuritySafeCritical] // matches the attribute on the base class ctor
    public MyWebClient() { }
}

... но в любом случае получите следующую ошибку:

Нарушение правил безопасности наследования при переопределении члена: 'MyWebClient..ctor ()'. Доступность для безопасности метода переопределения должна соответствовать доступности безопасности переопределяемого метода.

Мне кажется, это случай в 0,1%, о котором он упоминает. К сожалению, насколько я могу судить, в следующих постах никогда не раскрывалось, какое правило будет здесь. Таким образом, у меня есть два вопроса:

  1. Кто-нибудь знает, что это за правило в 0,1%?
  2. Учитывая 1, возможно ли извлечь из WebClient в Silverlight 4?

1 Ответ

0 голосов
/ 03 марта 2013

Мой ответ на на этот вопрос охватывает вашу первую часть.

Ответ на вопрос 2 - просто нет, но в случае с WebClient вы можете создать свой собственный, если у вас есть для этого причины.

...