
IVideoManager. הפונקציה GetVideoNames מחזירה את שמות הסרטונים, והפונקציה DownloadVideo(string videoName) מחזירה Stream. שתיהן מסומנות ב-ServiceContract וב-OperationContract.GlobalProperties (internal ו-static) מכילה את הנתיב. בעזרת #if DEBUG ו-#else הנתיב נקבע לפי מצב הבנייה: בפיתוח התיקייה נמצאת בתיקיית הפרויקט, וב-Release היא נמצאת ליד קובץ ההרצה. הקוד שבאזור שלא נבחר לא נכנס לקובץ ההרצה בכלל.DownloadVideo פותחת FileStream על הקובץ ומחזירה אותו. השרת לא סוגר את הסטרים, כי הוא צריך להישאר פתוח בזמן שהלקוח קורא.videos.FileStream לכתיבה לקובץ מקומי, ואז לולאה שקוראת מהסטרים מנות של 4096 בתים (Read) וכותבת אותן (Write). ברגע שיש מידע בקובץ מתחילים לנגן עם myPlayer.Source = new Uri(path, UriKind.Absolute) ו-Play(), בזמן שההורדה ממשיכה.הטקסט המלא של הדקות הראשונות בהרצאה «Streaming» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו עוברים לנושא הסטרימינג נושא הסטרימינג זה נושא שבעזרתו אנחנו יכולים להוריד מהשרת קובץ על ידי פתיחת סטרים אליו כאשר סטרים זה סך הכל קו תקשורת בין שתי נקודות שיכול להתפרס ברשת בין שני מחשבים ומה שאנחנו עושים אנחנו הולכים לפתוח בשרת את הסטרים שמצביע על איזשהו קובץ להחזיר את האובייקט סטרים ללקוח
כאשר האובייקט סטרים עדיין נשאר פתוח כי כל סטרים כמובן שאנחנו צריכים לסגור אותו בסופו של דבר על ידי קלוז או דיספוז ובגלל שאנחנו העברנו ללקוח את האובייקט סטרים עדיין הלקוח יכול לקרוא את המידע תוך כדי זה שהשרט כותב אליו ואז לדוגמה אם אנחנו מעבירים סרטון וידאו בצורה כזאת אז עדיין השרת יכול לכתוב את המידע לתוך קובץ הסטרים לתוך אובייקט הסטרים ליתר דיוק
והלקוח קורא את המידע תוך כדי זה שהשרט כותב אליו וזה טוב בקבצים מאוד מאוד גדולים, לדוגמה בקבצי וידאו שאנחנו יכולים בצד של הלקוח להתחיל להציג את הוידאו למרות שהוידאו עדיין לא הספיק להתעיין בכללותו ללקוח.
לדוגמה אתם יכולים לראות את זה ביוטיוב כאשר אתם צופים בוידאו ועדיין כל הוידאו עדיין לא ירד אבל עדיין יכולים להתחיל לפחות לצפות בו ותוך כדי הצפייה המערכת מורידה דרך הסטרים את שאר המידע.
אז לצורך כך אנחנו הולכים להעביר שרטון וידאו מהשרת ללקוח ולצפות בו בואו נצרף dll חדש עבור ה-wcf סרוויס שלנו. אז נלך ל-add new project, נבחר ב-class library ונגדיר לו שם משמעותי, לדוגמה video manager library.
נלחץ אישור ונשאר לנו לבנות ב-dll הזה את האינטרפייס. אז נצרף אינטרפייס חדש, add a new item, נבחר אובייקט אינטרפייס, נגדיר לו את ההגדרות המתאימות.
נקרא לאינטרפייס הזה בשם i video manager, נגדיר אותו כפאבליק ונגדיר בו פונקציות דומות לפונקציות שעשינו כשהורדנו תמונה. יש לנו פונקציה אחת שמחזירה את השמות של סרטוני הוידאו שיש בשרת כך שהלקוח יכול לבחור אחת מהן.
נקרא לפונקציה הזאת get video names. פונקציה שנייה זאת הפונקציה שתחזיר לנו סטרין לוידאו שנבחר. ולכן היא תחזיר לנו אובייקט סטרין.
נקרא לפונקציה הזאת DownloadVideo שהיא תקבל את ה-VideoName. אוקיי, עכשיו אנחנו צריכים להגדיר את ההגדרות המתאימות עבור האטריביוטס שחושפים את הממשק ואת הפונקציות, ואנחנו רוצים לגשת ל-System.ServiceModel הנה הוא כאן, נצרף אותו ונגדיר Service Contract ונגדיר
מעל כל פונקציה Operation Contract. ניפטר מכל מרחבי השמות המיותרים וסיימנו לבנות את האינטרפייס. כעת אנחנו יכולים ללכת לקלאס ולבנות את המחלקה שתחזיר את ה-Stream.
בואו נקרא למחלקה הזאת "וידאו מנאג'ר". אנחנו יכולים לגשת לקובץ שלה, זה פה. דבר ראשון, נראה שאת הממשק "i video manager" קונטרול נקודה ואנטר יממש את הפונקציות.
אוקיי, אז מה אנחנו צריכים להגדיר כאן? נגדיר קודם כל Using System I/O עבור סטרים, ונתחיל עם הפונקציה הראשונה שמורידה את השמות, מביאה ללקוח את השמות של הסרטונים.
ניקח כאן מערך מכרוזות, נקרא לו full path files ונקבל את כל הקבצים מאיזושהי תיקייה. התיקייה שאנחנו רוצים לקבל את הקבצים זאת התיקייה הנוכחית, לגשת אליה זה על ידי ApplicationStartupPath, אבל אנחנו צריכים בשביל זה לצרף ל-reference.
בואו נצרף את ה-reference, נראה אולי הוא ב-recent, הנה הוא כאן. סיסטם ווינדוס פורמס זה מאפשר לי להגיע למחלקה אפליקיישן ובתוכה סטארט אפ פאט הנתיב שאנחנו רוצים כרגע בגלל שאנחנו משתמשים בפורמט דיבאג אנחנו רוצים להעלות שתי תיקיות ולהגיע לתיקיה
שאנחנו צריכים ליצור שנקראת וידאו פול פאט פיילס יהיה לי את השמות של הקבצים אבל יהיה לי גם את כל השמות של הנתיבים ואת זה אני לא רוצה להעביר ללקוח קודם כל לקוח לא אמור לראות את הנתיב הוא לא אמור לדעת מה יש במחשב של השרת, הוא אמור לדעת מקסימום את השמות של הקבצים אם לא איזשהו קוד או friendly name עבור שם של כל קובץ.
אז לצורך כך String, נעשה דברים דומים לדברים שעשינו בסרטון של התמונות. יש לי פה File Names New String, נלך וניקח את אותו הגודל Full Path Length ונרוץ על Full Path Length ופשוט נאתר רק את השם של הקובץ.
לצורך כך נשתמש במחלקה File Info. שתתלבש על קובץ שיש לו full path ואז רק בפייל ניימס נכניס את השם שלו שהוא כולל גם את הסיומת פה בעצם אנחנו צריכים i בצורה כזאת ולבסוף נחזיר פייל ניימס אז הפונקציה get videos names מחזירה לי רק את השמות של סרטוני הוידאו שקיימים בשרת בתיקי הוידאו
אוקיי, מילה אחת לגבי זה שעלינו כאן שתי תיקיות. מה שקורה זה שקובץ האקסקיושן by default בדוטנט רץ בתיקייה שנקראת בין, בתוכה יש תיקייה שנקראת דיבאג או ריליסט, תלוי בהגדרה הזאת שהגדרנו פה, ושם יש את קובץ האקסקיושן.
כאשר אני עובד בדיזיין, כלומר עובד מקומית בפיתוח, ב-development זה נקרא, אז אני אף פעם לא רוצה לשמור קבצים בתיקייה בין דיבאג, כלומר איפה שיושב קובץ אקסקיושן, מפני שהתיקייה בין דיבאג, בין ריליס או תיקיית אובי ג'יי גם שנמצאת באותו לבל של תיקיית בין,
תמיד אנחנו מוחקים אותם בשביל לבסות גיבויים. זה תיקיות שתמיד נפטרים מהם וויז'אול סטודיו יוצרת אותם אוטומטית. אז אם אני רוצה בזמן הפיתוח להתחבר לקובץ שאני רוצה לשמור אותו גם לזמן ההרצה, מסד נתונים, קובץ של מסד נתונים כמו access לדוגמה, קובץ אקסל, קובץ טקסט