Session C#- WEB API

Tami_L

משתמש חדש
אני מנסה לשמור מידע על משתמש בsession לאחר כל קריאה לAPI
בעזרת HttpContext.Current.Session אפשר לשמור מידע בסישן רק עבור הקריאה הנוכחית, בפעם הבאה שנקרא לפונקציה המידע שנכנס בפעם הקודמת לא נשמר.
למישהו יש רעיון איך אפשר לשמור עבור כל הקריאות?
ובנוסף איך אפשר לקבל את כל המידע עבור כל המשתמשים כלומר
אם הדף נטען מ 2 דפדפנים שונים, כל משתמש טען מידע אחר, אז איך אפשר לקבל מידע מכל הסשנים מאז העלאת האתר?

אשמח לעזרתכם
תודה רבה
 

סמרקט

מהמשתמשים המובילים!
הנדסת תוכנה
D I G I T A L
את יכולה להשתמש ב-cache
C#:
HttpContext.Current.Cache["cacheKey"]

למידע של משתמש, ה-cacheKey צריך להיות unique לפי משתמש.

ניתן לשמור כך גם את המידע עבור כל המשתמשים, ואז ה-cacheKey יהיה כללי.
אין לזה קשר לכך שהמשתמשים מגיעים מדפדפנים שונים.
בכל מקרה המידע נשמר בצד שרת.
 

Tami_L

משתמש חדש
תודה
אבל אני צריכה להשתמש דווקא ב session כדי לשמור מידע לכל משתמש בנפרד
 

סמרקט

מהמשתמשים המובילים!
הנדסת תוכנה
D I G I T A L
תודה
אבל אני צריכה להשתמש דווקא ב session כדי לשמור מידע לכל משתמש בנפרד
גם ב-cache אפשר לשמור עבור כל משתמש בנפרד.
את פשוט נותנת key שהוא חד ערכי לפי משתמש.
נניח את רוצה לשמור את כתובת המשתמש, אז ה-key של ה-value יהיה כזה: 123456789_address,
כלומר שרשור של שם המידע עם id של המשתמש.
 

Tami_L

משתמש חדש
נכון
אבל אני לא מתחזקת key עבור כל משתמש (כל משתמש מכניס נתונים כלשהם לפי בחירתו, אני לא שומרת נתונים על המשתמש)
אני מחפשת לממש את זה בעזרת סשן ללא שמירת ערכים נוספים - זו הדרישה שקיבלתי
 

מבקשת מידע

משתמש מקצוען
זה תלוי במימוש של הדפים בצד השרת,
בגדול, היום יותר עובדים בצורה של Stateless, הכוללת HTML נקי (עם ספריות קלינט) וקריאות לWEBAPI בשרת,
במצב הזה אין SESSION משותף לכל הקריאות, וגם לא מומלץ להשתמש בו.
יכול להיות שיש דרכים לעקוף כמו מה ש @גזעי צטטה, או כמו כאן

כדי שיהיה SESSION, אפשר לחזור ל MVC, אז גם הקריאות לAPI יכולות להשתמש בSESSION
 

Tami_L

משתמש חדש
בגדול, היום יותר עובדים בצורה של Stateless, הכוללת HTML נקי (עם ספריות קלינט) וקריאות לWEBAPI בשרת,
במצב הזה אין SESSION משותף לכל הקריאות, וגם לא מומלץ להשתמש בו.
כלומר אני לא יכולה לשמור מידע משותף לכל הקריאות? או שיש דרך לעקוף את זה?
(אני עובדת עם ריאקט וWEB API) הצלחתי להגיע למצב של שמירה עבור קריאה אחת בעזרת HttpContext.Current.Session כמו שציטטת כאן אבל הבעיה שהמידע לא נשמר לקריאה של הפעם הבאה , HttpContext.Current -מדובר על הקריאה הנוכחית. אני מנסה למצוא דרך שתאפשר לי לשמור מידע בסשן עבור כל הקריאות, יש דרך לעשות את זה?
 
נערך לאחרונה ב:

גזעי

משתמש מקצוען
הנדסת תוכנה
D I G I T A L
כלומר אני לא יכולה לשמור מידע משותף לכל הקריאות? או שיש דרך לעקוף את זה?
(אני עובדת עם ריאקט וWEB API) הצלחתי להגיע למצב של שמירה עבור קריאה אחת בעזרת HttpContext.Current.Session כמו שציטטת כאן אבל הבעיה שהמידע לא נשמר לקריאה של הפעם הבאה , HttpContext.Current -מדובר על הקריאה הנוכחית. אני מנסה למצוא דרך שתאפשר לי לשמור מידע עבור כל הקריאות, יש דרך לעשות את זה?
לשלוח Authorization בכל בקשה (שזה קצת כמו להשתמש בסשן)
 

סמרקט

מהמשתמשים המובילים!
הנדסת תוכנה
D I G I T A L
אולי תפרטי איזה מידע את רוצה לשמור ב-session ולמה?

זה מידע שהקליינט שולח, או נתונים שה-server מייצר (שולף מ-db נניח)?
ולמה לשמור - כדי לחסוך את ההעברה מהקליינט לסרבר בכל קריאה, או כדי לחסוך את השליפה מה-db?

או בכלל צורך אחר...
 

מבקשת מידע

משתמש מקצוען
כלומר אני לא יכולה לשמור מידע משותף לכל הקריאות? או שיש דרך לעקוף את זה?
(אני עובדת עם ריאקט וWEB API) הצלחתי להגיע למצב של שמירה עבור קריאה אחת בעזרת HttpContext.Current.Session כמו שציטטת כאן אבל הבעיה שהמידע לא נשמר לקריאה של הפעם הבאה , HttpContext.Current -מדובר על הקריאה הנוכחית. אני מנסה למצוא דרך שתאפשר לי לשמור מידע בסשן עבור כל הקריאות, יש דרך לעשות את זה?
לא נכון לעקוף את זה, הגישה היא לבנות מערכת שהיא STATELESS.
הבאתי לך קודם לינקים לאיך כן לעשות את זה למרות שזה לא מומלץ.

למה באמת את רוצה לשמור בSESSION?
 

Tami_L

משתמש חדש
אולי תפרטי איזה מידע את רוצה לשמור ב-session ולמה?

זה מידע שהקליינט שולח, או נתונים שה-server מייצר (שולף מ-db נניח)?
ולמה לשמור - כדי לחסוך את ההעברה מהקליינט לסרבר בכל קריאה, או כדי לחסוך את השליפה מה-db?

או בכלל צורך אחר...
בעיקרון מה שאני מנסה לעשות זה אפליקציה פשוטה לפי דרישה שקיבלתי, המשתמש מכניס משימות בצד קלינט ואני צריכה לשמור את זה בצד סרבר בעזרת סשן, אין לי כאן בכלל DB, הייתי מנסה לעשות את זה בלי הסשן אבל בקשו ממני לעשות את זה דווקא בסשן.:(
זה מה שכתבתי עד כה:
C#:
    public class TaskController  : ApiController
    {
        [EnableCors(origins: "*", headers: "*", methods: "*")]
        
        public void AddTask([FromBody]Tasks tasks)
        {
            var session = HttpContext.Current.Session;
            
            session.Add( "task", tasks.text);
             }
 

מבקשת מידע

משתמש מקצוען
ניסית מתוך הלינק שהבאתי קודם?

קוד:
public class MyHttpControllerHandler
  : HttpControllerHandler, IRequiresSessionState
{
    public MyHttpControllerHandler(RouteData routeData): base(routeData)
    { }
}

public class MyHttpControllerRouteHandler : HttpControllerRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new MyHttpControllerHandler(requestContext.RouteData);
    }
}

public class ValuesController : ApiController
{
   public string GET(string input)
   {
       var session = HttpContext.Current.Session;
       if (session != null)
       {
           if (session["Time"] == null)
           {
               session["Time"] = DateTime.Now;
           }
           return "Session Time: " + session["Time"] + input;
       }
       return "Session is not availabe" + input;
    }
}

and then add the HttpControllerHandler to your API route:

קוד:
route.RouteHandler = new MyHttpControllerRouteHandler();
 

גזעי

משתמש מקצוען
הנדסת תוכנה
D I G I T A L
בעיקרון מה שאני מנסה לעשות זה אפליקציה פשוטה לפי דרישה שקיבלתי, המשתמש מכניס משימות בצד קלינט ואני צריכה לשמור את זה בצד סרבר בעזרת סשן, אין לי כאן בכלל DB, הייתי מנסה לעשות את זה בלי הסשן אבל בקשו ממני לעשות את זה דווקא בסשן.:(
זה מה שכתבתי עד כה:
C#:
    public class TaskController  : ApiController
    {
        [EnableCors(origins: "*", headers: "*", methods: "*")]
       
        public void AddTask([FromBody]Tasks tasks)
        {
            var session = HttpContext.Current.Session;
           
            session.Add( "task", tasks.text);
             }
ואת לא יכולה להתערב להם בדרישה?
אם בכל מקרה זה נשמר בסשן, אז ברגע שנמחק הסשן גם נמחק המידע, ומנגד את יכולה לשמור את זה בlocalStoage\sessionStorage והאריך את חיי שמירת המידע.
ואם זה משהו יותר מורכב, אז יש גם indexedDB
(או web sql שהוא כבר deprecated עד כמה שידוע לי)

את יכולה לייצר service worker שמחזיר את הtaskים המcache "כאילו" זה פנה לאיזה שרת.
ויש עוד הרבה דברים שאפשר לעשות בלי להשתמש בשרת :|

אבל אם הרעיון הוא שזה ישמר בשרת בצורה שתהיה נגישה למנהלי הפרויקט, אז חייבים סוג כלשהו של DB.
אחרת באמת אין שום סיבה לשמור את המידע בסשן, וכדאי שתציעי את הצעות היעול שלך, כי לפעמים "מנהלים" יש להם חצי הבנה בטכנולוגיה שזה יותר גרוע מחוסר הבנה מוחלט, ואז הם מנסים להסביר למתכנת מה צריך לעשות ואיך, וזה פשוט דקלומים של מושגים שהוא ראה באתרי טכנולוגיה.

סתם דוגמה שהיתה לי עם "מנהל", שהוא מסביר לי שהוא צריך פיתרון טכנולוגי לעשות X, והוא צריך שזה יהיה open-source! כי הוא עובד רק עם open-source! זה השיא של הקדמה הטכנולוגית! ואמרתי לו שאני יכול פשוט לפתח את X, והוא התעקש שזה חייב להיות open-source.....
 

סמרקט

מהמשתמשים המובילים!
הנדסת תוכנה
D I G I T A L
בעיקרון מה שאני מנסה לעשות זה אפליקציה פשוטה לפי דרישה שקיבלתי, המשתמש מכניס משימות בצד קלינט ואני צריכה לשמור את זה בצד סרבר בעזרת סשן, אין לי כאן בכלל DB, הייתי מנסה לעשות את זה בלי הסשן אבל בקשו ממני לעשות את זה דווקא בסשן.:(
זה מה שכתבתי עד כה:
C#:
    public class TaskController  : ApiController
    {
        [EnableCors(origins: "*", headers: "*", methods: "*")]
       
        public void AddTask([FromBody]Tasks tasks)
        {
            var session = HttpContext.Current.Session;
           
            session.Add( "task", tasks.text);
             }
זה נשמע כמו משימה לראיון עבודה, אני צודקת?
כי אם כן, יש מצב שלא הבנת את הדרישה שלהם עד הסוף.
לפעמים הם גם לא כותבים הכל, משאירים לך לקבל החלטות לבד (נניח, ליצור db)

וסורי אם זה היה ניחוש פרוע...
 

Tami_L

משתמש חדש
ואת לא יכולה להתערב להם בדרישה?
אם בכל מקרה זה נשמר בסשן, אז ברגע שנמחק הסשן גם נמחק המידע, ומנגד את יכולה לשמור את זה בlocalStoage\sessionStorage והאריך את חיי שמירת המידע.
ואם זה משהו יותר מורכב, אז יש גם indexedDB
(או web sql שהוא כבר deprecated עד כמה שידוע לי)

את יכולה לייצר service worker שמחזיר את הtaskים המcache "כאילו" זה פנה לאיזה שרת.
ויש עוד הרבה דברים שאפשר לעשות בלי להשתמש בשרת :|

אבל אם הרעיון הוא שזה ישמר בשרת בצורה שתהיה נגישה למנהלי הפרויקט, אז חייבים סוג כלשהו של DB.
אחרת באמת אין שום סיבה לשמור את המידע בסשן, וכדאי שתציעי את הצעות היעול שלך, כי לפעמים "מנהלים" יש להם חצי הבנה בטכנולוגיה שזה יותר גרוע מחוסר הבנה מוחלט, ואז הם מנסים להסביר למתכנת מה צריך לעשות ואיך, וזה פשוט דקלומים של מושגים שהוא ראה באתרי טכנולוגיה.

סתם דוגמה שהיתה לי עם "מנהל", שהוא מסביר לי שהוא צריך פיתרון טכנולוגי לעשות X, והוא צריך שזה יהיה open-source! כי הוא עובד רק עם open-source! זה השיא של הקדמה הטכנולוגית! ואמרתי לו שאני יכול פשוט לפתח את X, והוא התעקש שזה חייב להיות open-source.....
תודה רבה לכולם על העזרה!!!
באמת דיברתי איתם ומתברר שאין להם כ"כ הבנה בנושא הזה, כמו שגזעי אמרה
בסוף הגענו להסכמה לממש את זה בעזרת ה localStoage
 

נ.הרשקוביץ

משתמש חדש
היי אני צריכה חומר דחוף על Webapi דחוף
צריכה לפרויקט בC#
למשהו יש מושג איפה אני יכולה למצוא??
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק יד

א לַמְנַצֵּחַ לְדָוִד אָמַר נָבָל בְּלִבּוֹ אֵין אֱלֹהִים הִשְׁחִיתוּ הִתְעִיבוּ עֲלִילָה אֵין עֹשֵׂה טוֹב:ב יְהוָה מִשָּׁמַיִם הִשְׁקִיף עַל בְּנֵי אָדָם לִרְאוֹת הֲיֵשׁ מַשְׂכִּיל דֹּרֵשׁ אֶת אֱלֹהִים:ג הַכֹּל סָר יַחְדָּו נֶאֱלָחוּ אֵין עֹשֵׂה טוֹב אֵין גַּם אֶחָד:ד הֲלֹא יָדְעוּ כָּל פֹּעֲלֵי אָוֶן אֹכְלֵי עַמִּי אָכְלוּ לֶחֶם יְהוָה לֹא קָרָאוּ:ה שָׁם פָּחֲדוּ פָחַד כִּי אֱלֹהִים בְּדוֹר צַדִּיק:ו עֲצַת עָנִי תָבִישׁוּ כִּי יְהוָה מַחְסֵהוּ:ז מִי יִתֵּן מִצִּיּוֹן יְשׁוּעַת יִשְׂרָאֵל בְּשׁוּב יְהוָה שְׁבוּת עַמּוֹ יָגֵל יַעֲקֹב יִשְׂמַח יִשְׂרָאֵל:
נקרא  0  פעמים

אתגר AI

חג מתן תורה • 1

לוח מודעות

למעלה