2

Silverlight で Web アプリケーションを作成しています。以下に示すように、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=Inheritance セキュリティ ルールがメンバーのオーバーライド中に違反しました: 'SigmaWC.Utility.WebClientWithCookies ..ctor()'. オーバーライドするメソッドのセキュリティ アクセシビリティは、オーバーライドされるメソッドのセキュリティ アクセシビリティと一致する必要があります。StackTrace: SigmaWC.Utility.RestCommunicator..cctor() で InnerException:

Silverlight でセキュリティ設定を昇格する方法について、誰でも助けてもらえますか。

4

1 に答える 1

4

これに関するドキュメントは、控えめに言ってもほとんどありません。ただし、役立つリソースがいくつかあります。

MSDNではフレームワーク メンバーを使用できないことを示しますSecurityCriticalAttribute

SecurityCriticalAttribute を持つ型とメンバーは、Silverlight アプリケーション コードでは使用できません。セキュリティ クリティカルな型とメンバーは、.NET Framework for Silverlight クラス ライブラリの信頼されたコードによってのみ使用できます。

の場合WebClientGetWebRequestメソッドにはこの属性がありませんが、コンストラクターにはあります。

この 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);

    }
}
于 2012-07-26T20:13:36.263 に答える