כיצד ליישם DelegatingHandler עבור X-HTTP-Method-Override ב- API של האינטרנט

בעת פריסת ה- REST Web API שלך על ידי תחום ציבורי, לפעמים תיתקל בבעיות שקשורות לתמיכה בפעלים של HTTP. שני האתגרים בעניין זה הם התמיכה המוגבלת בפעלים של HTTP בדפדפני אינטרנט ישנים (כלומר הם תומכים רק ב- HTTP GET ו- HTTP POST) וחומות אש אגרסיביות החוסמות תעבורה שאינה HTTP GET או HTTP POST. כיצד יתמוך היישום שלך ב- PUT או DELETE במקרים אלה? כאן בדיוק נחלץ כותרת ה- HTTP של X-HTTP-Method-Override.

כותרת ה- HTTP של X-HTTP-Method-Override עובדת קצת דומה לפריצה. אתה יכול להוסיף את הכותרת עם הערך של PUT או DELETE בעת הפעלת ה- API של האינטרנט שלך באמצעות JavaScript או באמצעות XMLHttpRequestאובייקט מדפדפן אינטרנט באמצעות שיחת HTTP POST. לאחר מכן תוכל להעביר מטפל המייצג ליירט את שיטת ה- HTTP שתופעל ולנקוט בפעולות המתאימות.

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

פעלים ב- HTTP והאצלת מטפלים

אם אנו מוגבלים להשתמש רק בפעלים ה- HTTP GET ו- POST עקב מגבלות המוטלות על ידי הלקוח שלך, דפדפן האינטרנט או חומת האש שמול יישום האינטרנט שלך, נצטרך ליישם דרך לעקיפת הבעיה לתמיכה ב- PUT ו- DELETE. דרך זו לעקיפת הבעיה כוללת בדרך כלל הוספת כותרת ה- HTTP של X-HTTP-Method-Override לבקשה המציינת את הפועל בו אנו רוצים להשתמש במסגרת שיחת ה- HTTP POST. בנוסף, אנו זקוקים למטפל בהאצלת היישום שלנו אשר בודק את הכותרת, ואם הוא קיים, מבצע את השיחה לשיטת ה- HTTP שאתה מעוניין להפעיל.

לפני שנצלול לתוך היישום, בואו נסתכל במהירות על מה הם מטפלים המאצלים ולמה נשתמש בכזה כאן. מטפל בהאצלה ומטפלי הודעות אחרים מבוצעים מוקדם בצינור עיבוד הבקשה. אלו מחלקות המקבלות בקשות HTTP ומחזירות תגובת HTTP. מטפלי האצלה דומים ל- HttpModulesASP.Net. אך בניגוד HttpModules, ניתן לכבוש מטפלים בהאצלת מטפל: מטפל האצלת אחד יכול להתייחס למטפל האציל אחר. תוכלו ללמוד עוד על האצלת מטפלים במאמר הקודם שלי, "כיצד לעבוד עם מטפלים בהודעות ב- Web API."

צור בקר אינטרנט API

נניח שיש לך בקר אינטרנט API דומה לזה:

מחלקה ציבורית AuthorsController: ApiController

    {

        // GET: API / מחברים

        מספר IE מספר Get ()

        {

            להחזיר מחרוזת חדשה [] {"ג'וידיפ", "קנג'ילאל"};

        }

        // GET: api / מחברים / 1

        מחרוזת ציבורית קבל (int id)

        {

            החזירו "ג'וידיפ קנג'ילאל";

        }

        // פוסט API / מחבר

        פוסט בטל ציבורי (ערך מחבר [FromBody]) {}

        // PUT api / author / 1

        בטל ציבורי Put (מזהה int, ערך מחבר [FromBody]) {}

        // מחק ממשק API / מחבר / 1

        בטל ציבורי מחק (מזהה int) {}

    }

צור DelegatingHandler עבור X-HTTP-Method-Override

עכשיו בואו נפעיל מטפל X-HTTP-Method-Override. זהו מטפל בהודעות, כך שכרגיל הוא אמור להאריך את DelegatingHandlerהכיתה.

מחלקה ציבורית CustomMessageHandler: DelegatingHandler

    {

        מחרוזת readonly [] httpMethodsList = {“DELETE”, “HEAD”, “PUT”};

        מחרוזת const httpMethodOverrideheader;

        עקיפה מוגנת משימה SendAsync (HttpRequestMessage בקשה, CancellationToken cancellationToken)

        {

            if (request.Method == HttpMethod.Post && request.Headers.Contains (httpMethodOverrideheader))

            {               

                var httpMethod = request.Headers.GetValues ​​(httpMethodOverrideheader). FirstOrDefault ();

                אם (httpMethodsList.Contains (httpMethod, StringComparer.InvariantCultureIgnoreCase))

                {                  

                    request.Method = HttpMethod חדש (httpMethod);

                }

            }

            base return.SendAsync (בקשה, ביטול אסימון);

        }

    }

הקוד די מסביר את עצמו. זה בודק אם HTTP POST מכיל את כותרת ה- X-HTTP-Method-Override. אם הכותרת נמצאת ברשימת השיטות, שיטת הבקשה משתנה.

רשום את DelegatingHandler

השלב הבא הוא רישום המטפל. באפשרותך לעשות זאת על ידי הוספת מטפל חדש זה לאוסף MessageHandlers במחלקה WebApiConfig כפי שמוצג בקטע הקוד שלמטה.

רישום ריק סטטי ציבורי (תצורת HttpConfiguration)

{

    config.MessageHandlers.Add (CustomMessageHandler חדש ());

     // מסלולי Web API

    config.MapHttpAttributeRoutes ();

     config.Routes.MapHttpRoute (

        שם: "DefaultApi",

        routeTemplate: "api / {controller} / {id}",

        ברירות מחדל: חדש {id = RouteParameter.Optional}

    );

}

לחלופין, תוכלו לרשום את המטפל המאציל באמצעות Application_Startמטפל האירועים בקובץ Global.asax.cs כמוצג להלן.

חלל מוגן Application_Start (שולח האובייקט, EventArgs e)

        {

            RegisterRoutes (RouteTable.Routes);

            GlobalConfiguration.Configuration.MessageHandlers.Add (CustomMessageHandler חדש ());

        }

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

$ .ajax ({

  url: “// localhost: 9820 / api / Authors / 1”,

  סוג: "POST",

  נתונים: JSON.stringify (authorData),

  כותרות: {

      "סוג תוכן": "יישום / json",

      "X-HTTP-Method-Override": "PUT"},

})

כפי שאתה יכול לראות בקטע הקוד הקודם, כל שעליך לעשות הוא לציין את שיטת ה- HTTP שאתה רוצה להפעיל בכותרת הבקשה - X-HTTP-Method-Override : DELETEאו X-HTTP-Method-Override : PUT- ואז לבצע שיחת POST למשאב שלך.