Нарушены правила безопасности наследования при переопределении члена в Silverlight

Я работаю над веб-приложением в Silverlight. Я перегрузил метод WebClient.GetWebRequest, как указано ниже:

public class WebClientWithCookies : WebClient
    {
        [SecurityCritical]
        protected override WebRequest GetWebRequest(Uri address)
        {
            string cookieContent = HtmlPage.Document.Cookies;

            WebRequest request = base.GetWebRequest(address);
            HttpWebRequest webRequest = request as HttpWebRequest;
            if (webRequest != null && cookieContent != null && cookieContent != string.Empty)
            {
                CookieContainer cookieContainer = new CookieContainer();
                cookieContainer.Add(address, new Cookie() { Value = HtmlPage.Document.Cookies });
                webRequest.CookieContainer = cookieContainer;
            }
            return request;
        }
    }

Но я получаю следующее исключение:

System.TypeInitializationException не было обработано кодом пользователя
Message=Инициализатор типа для 'SigmaWC.Utility.RestCommunicator' вызвал исключение. TypeName=SigmaWC.Utility.RestCommunicator
StackTrace: at SigmaWC.Utility.RestCommunicator..ctor() at SigmaWC.App..ctor() InnerException: System.TypeLoadException Message=Правила безопасности наследования нарушены при переопределении члена: 'SigmaWC. Utility.WebClientWithCookies..ctor()'. Доступность с точки зрения безопасности переопределяемого метода должна соответствовать доступности с точки зрения безопасности переопределяемого метода. StackTrace: в SigmaWC.Utility.RestCommunicator..cctor() Внутреннее исключение:

Может ли кто-нибудь помочь в том, как повысить настройки безопасности в Silverlight.


person Rajat Saini    schedule 05.06.2012    source источник


Ответы (1)


Документов об этом, мягко говоря, мало. Тем не менее, есть несколько полезных ресурсов:

MSDN Указывает, что вы не можете использовать элементы фреймворка с SecurityCriticalAttribute.

Типы и члены с атрибутом SecurityCriticalAttribute не могут использоваться кодом приложения Silverlight. Критические для безопасности типы и члены могут использоваться только доверенным кодом в библиотеке классов .NET Framework for Silverlight.

В случае WebClient метод GetWebRequest не имеет этого атрибута, однако он есть у конструктора.

Этот блог безопасности MSDN Подразумевается, что if the default constructor has any Security attribute, the class cannot be used for inheritance in a Silverlight client.

Кроме того, в вышеупомянутом блоге MSDN подразумевается, что атрибуты безопасности игнорируются в сборках Silverlight, которые не являются частью базовой структуры. Однако это может применяться только к атрибутам уровня сборки.

Во всяком случае, чтобы сократить длинную историю. You cannot derive from WebClient because of the SecuritySafeAttribute on the constructor. Чтобы проиллюстрировать это, это также вызывает исключение во время выполнения:

public class MyWebClient : WebClient
{

}

Альтернативой является развертывание собственного WebClient. Это требует небольшой работы, но следующий пример работает со следующим обработчиком:

public class MyHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        context.Response.Write("Hello World");
        foreach (Cookie cookie in context.Response.Cookies)
        {
            //Cookies from the client - there will be 1 in this case
        }
    }

...

public class MyWebClient
{
    public MyWebClient()
    {

    }

    public void InvokeWebRequest(Uri address)
    {
        //Set the cookie you want to use.
        string cookieContent = "I like cookies";

        // Register a http client - without this the following webRequest.CookieContainer setter will throw an exception
        WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

        //This bit you know, but dont forget to set Name on your new Cookie.
        HttpWebRequest webRequest = WebRequest.Create(address.AbsoluteUri) as HttpWebRequest;
        if (webRequest != null && !String.IsNullOrWhiteSpace(cookieContent))
        {
            webRequest.CookieContainer = new CookieContainer();
            webRequest.CookieContainer.Add(address, new Cookie() { Value = cookieContent, Name = "MyCookie" });
        }

        //Invoke the async GetResponse method.
        webRequest.BeginGetResponse(o =>
            {
                HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(o);
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {
                    //Read the result
                    string result = reader.ReadToEnd();
                }

                foreach (Cookie cookie in response.Cookies)
                {
                    //The cookies returned from the server.
                }
            }, null);

    }
}
person Silver Solver    schedule 26.07.2012