سؤال

وأريد أن النفق من خلال طلب HTTP من خدمة بلدي إلى ملقم بعيد، مرورا كافة ملفات تعريف الارتباط. لذلك أنا إنشاء كائن HttpWebRequest جديد وتريد تعيين ملفات تعريف الارتباط على ذلك.

وHttpWebRequest.CookieContainer هو نوع System.Net.CookieContainer الذي يحمل System.Net.Cookies،

في بلدي واردة وجوه الطلب:

وHttpRequest.Cookies هو نوع System.Web.HttpCookieCollection التي تتولى System.Web.HttpCookies.

وفي الأساس أريد أن أكون قادرة على التنازل عنها لبعضها البعض، ولكن أنواع مختلفة يجعل من المستحيل. لا بد لي من تحويلها عن طريق نسخ قيمهم، أم أن هناك طريقة أفضل؟

هل كانت مفيدة؟

المحلول

وهنا رمز لقد استعملت لنقل الكائنات ملفات تعريف الارتباط من الطلب الوارد إلى الجديد HttpWebRequest ... ( "myRequest" هو اسم بلدي الكائن HttpWebRequest.)

HttpCookieCollection oCookies = Request.Cookies;
for ( int j = 0; j < oCookies.Count; j++ ) 
{
    HttpCookie oCookie = oCookies.Get( j );
    Cookie oC = new Cookie();

    // Convert between the System.Net.Cookie to a System.Web.HttpCookie...
    oC.Domain   = myRequest.RequestUri.Host;
    oC.Expires  = oCookie.Expires;
    oC.Name     = oCookie.Name;
    oC.Path     = oCookie.Path;
    oC.Secure   = oCookie.Secure;
    oC.Value    = oCookie.Value;

    myRequest.CookieContainer.Add( oC );
}

نصائح أخرى

وكان لي حاجة للقيام بذلك اليوم لموقع SharePoint الذي يستخدم مصادقة النماذج وبناء (FBA). إذا حاولت، وندعو صفحة التطبيق دون استنساخ الكوكيز وتعيين الكائن CookieContainer ثم ستفشل الطلب.

واخترت مجردة المهمة لهذه الطريقة تمديد مفيد:

public static CookieContainer GetCookieContainer(this System.Web.HttpRequest SourceHttpRequest, System.Net.HttpWebRequest TargetHttpWebRequest)
    {
        System.Web.HttpCookieCollection sourceCookies = SourceHttpRequest.Cookies;
        if (sourceCookies.Count == 0)
            return null;
        else
        {
            CookieContainer cookieContainer = new CookieContainer();
            for (int i = 0; i < sourceCookies.Count; i++)                
            {
                System.Web.HttpCookie cSource = sourceCookies[i];
                Cookie cookieTarget = new Cookie() { Domain = TargetHttpWebRequest.RequestUri.Host, 
                                                     Name = cSource.Name, 
                                                     Path = cSource.Path, 
                                                     Secure = cSource.Secure, 
                                                     Value = cSource.Value };
                cookieContainer.Add(cookieTarget);
            }
            return cookieContainer;
        }
    }

وبعد ذلك يمكنك فقط الذي يطلق عليه من أي كائن HttpRequest مع هدف HttpWebRequest كائن كمعلمة، على سبيل المثال:

HttpWebRequest request;                
request = (HttpWebRequest)WebRequest.Create(TargetUrl);
request.Method = "GET";
request.Credentials = CredentialCache.DefaultCredentials;
request.CookieContainer = SourceRequest.GetCookieContainer(request);                
request.BeginGetResponse(null, null);

وحيث TargetUrl هو رابط لصفحة أنا بعد وSourceRequest هو HttpRequest الصفحة أنا في الوقت الحاضر، تم استردادها عبر Page.Request.

واقترح من ديفيد هو حق واحد. تحتاج إلى نسخ. ببساطة إنشاء وظيفة لنسخ مرارا وتكرارا. HttpCookie وجوه كوكي تم إنشاؤه للتأكد من أننا يمكن أن تفرق في كل من وظائفه وأين تأتي. HttpCookie المستخدمة بين المستخدم والوكيل يستخدم ملفات تعريف الارتباط بين الوكيل وخادم الويب عن بعد.

وHttpCookie لديها وظائف أقل منذ الكعكة ونشأت منك وأنت تعرف كيفية التعامل معها. كوكي توفر لك لإدارة الكعكة التي وردت من خادم الويب. مثل CookieContainer، ويمكن استخدامها لإدارة المجال المسار وانتهاء.

وهكذا الجانب المستخدم وخادم الويب الجانب هو مختلف وتوصيله، بالتأكيد تحتاج إلى تحويلها. في الحالة الخاصة بك، فإنه احالة ببساطة المباشر.

لاحظ أن CookieContainer لديها خلل في. إضافة (كوكي) و.GetCookies (أوري) الأسلوب.

واطلع على تفاصيل وإصلاح هنا:

HTTP: // نقطة -net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

وCallMeLaNN

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top