سؤال

المشهد - أنا أكتب تطبيق ويب يستند إلى مربع تسجيل الدخول الذي تستخدمه (Database1 و Database2) ، وسوف يقوم بتوصيلك بقاعدة بيانات Cooresponding. لقد قمت بتعيين web.config لعقد كلا سلاسل الاتصال. على طريقة ON_AUTHENTICE لكل مربع أتحقق منها لمصادقة المستخدم ثم إرسال سلسلة استنادًا إلى مربع تسجيل الدخول إلى متغير عام في فئة تسمى مستخدم Authenticate. يقوم هذا المتغير العام بالتحقق من ملف تعريف الارتباط ويحصل على اسم سلسلة الاتصال من المتغير ، إذا كان ملف تعريف الارتباط لاغًا ، فإنه يضع ملف تعريف ارتباط جديد ، وينتهي صلاحية جميع ملفات تعريف الارتباط الحالية ويعين قيم ملفات تعريف الارتباط.

الآن بمجرد الانتهاء من ذلك ، في كل مرة أضغط فيها على قاعدة البيانات (باستخدام LINQ2SQL) أقوم بإنشاء datacontext وأرسل في antainticatedUser.connectionString. سيؤدي ذلك إلى التحقق من ملف تعريف الارتباط وإرسال سلسلة الاتصال لاستخدامها لسحب البيانات. هيرر هو فئة المصادقة ...

public class AuthenticatedUser : System.Web.UI.Page
{
public static string ConnectionString
{
    get
    {
        HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"];
        return GetConnectionStringFromName(myCookie);
    }
    set
    {
        if (HttpContext.Current.Request.Cookies["connectionString"] != null)
        {
            ExpireCookies(HttpContext.Current);
        }
        var allCookies = HttpContext.Current.Request.Cookies.AllKeys;
        HttpCookie cookie = new HttpCookie("connectionString");
        cookie.Value = value;
        cookie.Expires = DateTime.Now.AddYears(100);
        HttpContext.Current.Request.Cookies.Add(cookie);
    }
}

private static string GetConnectionStringFromName(HttpCookie myCookie)
{
    string connectionStringName = myCookie.Value;
    return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
}

private static void ExpireCookies(HttpContext current)
{
    var allCookies = current.Request.Cookies.AllKeys;
    foreach (var cook in allCookies.Select(c => current.Response.Cookies[c]).Where(cook => cook != null))
    {
        cook.Value = "";
        cook.Expires = DateTime.Now.AddDays(-1);
        current.Request.Cookies.Remove(cook.Name);
        cook.Name = "";
    }
} 

}

الآن يبدو أن هذا يعمل على النقر الأول من تسجيل الدخول. عندما أكتب معلومات المستخدم وأتخطى العملية ، يمكنني رؤية ملف تعريف الارتباط الذي يتم تعيينه/ على الرغم من أول مكالمة قاعدة بيانات حقيقية حيث أستخدم PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString); أحصل على خطأ مرجعي فارغ. إنه يمر عبر GET ويتحقق من ملف تعريف الارتباط ويعيد ملف تعريف ارتباط فارغ. ما يمكن أن يحدث هنا؟

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

المحلول

تحتاج إلى إضافة ملف تعريف الارتباط إلى مجموعة Response.Cookies عند إعداده بدلاً من مجموعة request.cookies. يتم إرسال ملفات تعريف الارتباط فقط في الاستجابة إلى متصفح المستخدم.

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