הפעם נראה כיצד בקלות ניתן לשנות הרשאות של קובץ דרך הקוד. השימוש הוא די קל וברור. אנו נשתמש במחלקה FileSecurity.
fs = File.GetAccessControl(this.filename);
אנו בעצם מושכים את המידע עבור הקובץ שאנו רוצים. כעת אנו יכולים או לבדוק את ההרשאות דרך פונקציות שונות במחלקה הזאת, או שניתן לשנות אותן. כדי לשנות נוסיף חוק חדש שאוסר על כולם לקרוא מהקובץ
FileSystemAccessRule ar = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Deny);
המחלקה זאת מקבלת את שם הקבוצה שעליה יחול הכלל - EVERYONE, את סוג הגישה לקובץ - FULLCONTROL, והאם להרשות/לאסור - DENY
נוסיף את הכלל החדש לרשימת הכללים של הקובץ
fs.AddAccessRule(ar);
כעת רק נשאר לשמור את הכלל החדש
File.SetAccessControl(this.filename, fs);
והתוצאה
כעת כדי להסיר את הכלל שעשינו נבצע את אותו התהליך, רק הפוך
FileSecurity fs = File.GetAccessControl(this.filename);
FileSystemAccessRule ar = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Deny);
fs.RemoveAccessRule(ar );
File.SetAccessControl(this.filename, fs);
שימו לב שבנינו שוב את הכלל הזה שאוסר גישה לקובץ, רק הפעם השתמשנו בפונקציה RemoveAccessRule כדי להוריד אותו מהקובץ
להורדת פרוייקט דוגמה
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5
אם אני רוצה לשלב בתוך הדף שלי פלט של דפים אחרים במערכת(לא header או footer שאותם ניתן לשלב ב masterpage...), משהו שיהיה תלוי באיזה משתנה למשל, אז בעבר הלא רחוק היה נהוג להשתמש ב include, למשל, אם נכנסתי לדף בתור משתמש רגיל אזי הייתי רוצה לכלול את הקובץ:
<-- #include File = "c:\Inetpub\wwwroot\MyApplication\userWelcome.asp" -->
ואם בתור מנהל אז קובץ אחר...
<-- #include File = "c:\Inetpub\wwwroot\MyApplication\ManagerWelcome.asp" -->
הבעיה עם הקוד הזה היא שהשרת היה מריץ את הקובץ שאני רוצה להכליל, עוד לפני שהוא בודק את התנאי שלי, מה שאומר שהוא בעצם הריץ גם את הקובץ למנהל וגם את הקובץ למשתמש רגיל בעת הכניסה לדף, ורק אז היה בודק את התנאי והיה מציג את התוכן שרציתי.
ואם היו לי 8 כאלה בדף...?
בשביל זה יש את Server.Execute... פשוט מאוד, פשוט להעביר לו את הכתובת של הדף (המקומי בלבד!) שאנו רוצים להריץ, והפלט שלו יתווסף לדף שאני מריץ עכשיו. נניח שאני רוצה לכלול בגוף הדף הודעה בהתאם לשפת המשתמש (למרות שיש שיטות טובות יותר כמובן...), אזי הקוד שלנו יהיה :
<html>
<body>
<H1>Company Name</H1>
<% string lang = Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"];
lang = lang.SubString(0,2);
Server.Execute(lang+"Welcome.asp") ; %>
</body> </html>
להורדת הפרוייקט
msdn at microsoft
Technorati Tags:
ServerExecute
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5
רוב מה שאני כותב בקשר לרפלקשן אני משתמש לצורך ה unit testing שלי, בדרך כלל אני מנסה להימנע משימוש בזה בייצור.
עם כל ההנאה שיש בקוד דינאמי, לא תמיד אני יכול להרשות את זה לעצמי, בעיקר בגלל נושא הביצועים.
אז לפני כמה ימים, כשאני כותב כמה בדיקות לקוד, עלתה בדעתי מחשבה.
הרבה מהקוד שלי מבצע עידכון וטעינה של מידע מהדטה בייס לאובייקטים עסקיים.
הרבה משתמשים ב ORM לצורך ביצוע המשימות האלה, אך שוב, באפליקציה הראשית של החברה שבה אני עובד אין אפשרות להשתמש בתוכנות אלו, גם בגלל ביצועים, וגם בגלל מורכבות השאילתות והקשרים בין הטבלאות.
אז יוצא שהרבה בדיקות שאני כותב הם לפונקציות שלוקחות אובייקט עסקי ומעדכנות את הטבלאות המתאימות, ומצד שני פונקציות שמושכות מידע ויוצרות את האובייקטים העסקיים.
המטרה שלי בבדיקה היא לבדוק שאכן האובייקט שנטען מהדטה בייס מכיל את אותם הנתונים שהכיל האובייקט ששלחתי לשמירה. כך יצא שמאות פעמים אני צריך לכתוב משהו בסגנון
FieldInfo a;
FieldInfo b;
Assert.AreEqual(a.FieldType, b.FieldType, "field type");
Assert.AreEqual(a.IsAssembly, b.IsAssembly, "is assembly");
וכך עבור כל פרופרטי שיש לאובייקט. ואז אמרתי לעצמי, למה להיות חמור? בסך הכל אתה משווה ערכים, תכתוב כבר פונקציה שתעשה את זה בשבילך. וזה מה שיצא לי:
public static void CompareObjects(object a, object b)
{
if (a == null) Assert.Fail("a is null");
if (b == null) Assert.Fail("b is null");
Type t1 = a.GetType();
Type t2 = b.GetType();
if (t1 != t2)
{
Assert.Fail("Type a (" + t1.Name + ") is not as type as type b(" t2.Name + ")");
}
PropertyInfo[] pi = t1.GetProperties();
for (int i = 0; i < pi.Length; i++)
{
object val1 = pi[i].GetGetMethod().Invoke(a, null);
object val2 = pi[i].GetGetMethod().Invoke(b, null);
Assert.AreEqual(val1, val2, pi[i].Name);
}
}
הסבר קטן למי צריך: קודם אני בודק שאכן המצביעים לאובייקטים לא ריקים. אחר כך אני בודק שהם בכלל מאותו סוג של אובייקט. רק עכשיו אני מושך את כל הפרופרטיס שלהם ומתחיל להשוות אחד אחד... נחמד, בכמה שורות חסכתי מאות שורות, או שבעצם לא נחמד, שעד עכשיו לא עלה על דעתי לעשות את זה... ישנה עוד תוספת קטנה לפונקציה. הרבה מהאובייקטים מכילים תאריך עדכון אחרון שניתן על ידי בסיס הנתונים באופן אוטומטי, וגם במקרה של הכנסה חדשה לבסיס הנתונים יש את הערך של השדה המזהה בדרך כלל, ערכים אלו יהיו שונים בין האובייקט לפני ההכנסה לדטה בייס לאובייקט שנטען לאחר ההכנסה ואז הפונקציה תמיד תזרוק הודעת כישלון.... אז הנה תיקון קטן לקוד:
public static void CompareObjects(object a, object b, string[] exclude)
{
if (a == null) Assert.Fail("a is null");
if (b == null) Assert.Fail("b is null");
Type t1 = a.GetType();
Type t2 = b.GetType();
if (t1 != t2)
{
Assert.Fail("Type a (" + t1.Name + ") is not as type b (" + t2.Name + ")");
}
PropertyInfo[] pi = t1.GetProperties();
for (int i = 0; i < pi.Length; i++)
{
if (exclude != null && Array.IndexOf<string>(exclude, pi[i].Name) > -1)
{
continue;
}
object val1 = pi[i].GetGetMethod().Invoke(a, null);
object val2 = pi[i].GetGetMethod().Invoke(b, null);
Assert.AreEqual(val1, val2, pi[i].Name);
}
}
כעת הפונקציה מקבלת רשימה של פרופרטיס שאותם לא צריך לבדוק לדוגמה:
Customer a;
Customer b;
CompareObjects(a, b, new string[] { "Id", "LastUpdate" });
Currently rated 4.0 by 1 people
- Currently 4/5 Stars.
- 1
- 2
- 3
- 4
- 5