IHttpHandler
קורא לפעמים שיש לנו דרישה לעשות משהו שונה עם הפניה אלינו לאתר, משהו שהשרת לא עושה כמו שמתאים לנו. בדרך כלל כל פניה שמגיעה לאתר, לשרת יש רשימת קבצים וחוקים שניתן לשנות דרך הגדרות השרת, שאומרים לו מה לעשות עם הפניה לפי הסיומת של הקובץ - Aspx, html, gif וכו', או לפי הנתיב שבו נמצא הקובץ, למשל השרת יודע שפניה שמגיעה לתיקיה Bin צריך לסרב.
אז כבר דיברנו פעם על UrlRewriting ששם בעצם התערבנו לשרת בפניה על ידי שיכתוב של הנתיב - אנו נותנים ללקוח נתיב מסוים ובעצם מפנים את הבקשה לקובץ אחר בכלל, אז עכשיו נראה משהו דומה, אבל שונה, איך להתערב לשרת בבקשות ואיך ניתן דרך האפליקציה להגדיר חוקים לשרת ללא ממשק הניהול של השרת.
הבעיה היא כזאת - אני רוצה שכל פניה לתמונה בתיקיה מסוימת תעבור דרך קוד שלי, ולא דרך ברירת המחדל של השרת שהיא פשוט לשלוח את הקובץ. למה? הרבה סיבות, אבל מה שעניין אותי דווקא הוא משהו שאני אראה בפעם אחרת בעזרת השם.
הדבר פשוט ולוקח בערך 4 דקות...
קודם כל ניצור מחלקה שתטפל בבקשה המיוחדת שלי:
namespace MyApplicationDataProvider
{
class MyCustomHandler : IHttpHandler, IRequiresSessionState
{
#region IHttpHandler Members
bool IHttpHandler.IsReusable
{
get { return true; }
}
void IHttpHandler.ProcessRequest(HttpContext context)
{
}
}
}
IHttpHandler כדי שתוכל לטפל בפניות.זאת המחלקה הקטנה והפשוטה שלנו - שימו לב שהיא חייבת לירוש מהממשק
ומה נעשה עם הפניה, זה כבר תלוי בנו, אבל נניח שאני פשוט רוצה לכתוב להם בחזרה במקום התמונה שהם ביקשו, אז נעשה את זה בצורה הרגילה של
context.Request.Write("shalom");
אבל אני מניח שתמצאו דברים יותר מעניינים לעשות אם כבר קראתם עד לכאן...
עכשיו רק נשאר להודיע לאפליקציה שלנו איזה פניות להעביר למחלקה שלנו, ונעשה את כמובן דרך הווב קונפיג:
<system.web>
<httpHandlers>
<add path="images/private/*.gif" verb="GET" type="MyApplicationDataProvider.MyCustomHandler,
MyApplicationDataProvider"/>
</httpHandlers>
מה עשינו בדיוק? אמרנו לשרת שכל פניה שתגיע לתיקיה images/private וסוג הקובץ הוא gif להעביר למחלקה שלנו שנקראת MyCustomHandler ושם המתחם הוא MyApplicationDataProvider
אני גם ציינתי שרק אם הבקשה באה בצורה GET, אבל אם רוצים אפשר להפריד עם פסיק ולהוסיף גם POST