Bagaimana menerapkan DelegatingHandler untuk X-HTTP-Method-Override di Web API

Saat menerapkan REST Web API Anda melalui domain publik, terkadang Anda akan menemui masalah yang terkait dengan dukungan untuk verba HTTP. Dua tantangan dalam hal ini adalah dukungan terbatas untuk verba HTTP di browser web lama (yaitu, mereka hanya mendukung HTTP GET dan HTTP POST) dan firewall agresif yang memblokir lalu lintas yang bukan HTTP GET atau HTTP POST. Bagaimana aplikasi Anda mendukung PUT atau DELETE dalam kasus ini? Di sinilah tepatnya header HTTP X-HTTP-Method-Override menjadi penyelamat.

Header HTTP X-HTTP-Method-Override HTTP bekerja agak mirip dengan hack. Anda dapat menambahkan header dengan nilai PUT atau DELETE saat menjalankan API Web Anda melalui JavaScript atau melalui XMLHttpRequestobjek dari browser web menggunakan panggilan HTTP POST. Kemudian Anda dapat meminta penangan delegasi mencegat metode HTTP yang akan dipanggil dan mengambil tindakan yang sesuai.

Pada artikel ini saya akan membahas bagaimana kita dapat menggunakan penangan delegasi di depan pipeline request-response untuk mengubah permintaan untuk mengirim pesan yang valid ke aplikasi kita, atau mengubah respon untuk mengirim kembali respon yang valid ke klien.

Kata kerja HTTP dan penangan pendelegasian

Jika kami dibatasi untuk hanya menggunakan kata kerja HTTP GET dan POST karena batasan yang diberlakukan oleh klien Anda, browser web, atau firewall yang menjalankan aplikasi web Anda, kami harus menerapkan solusi untuk mendukung PUT dan DELETE. Solusi ini biasanya melibatkan penambahan header HTTP X-HTTP-Method-Override ke permintaan yang menentukan kata kerja yang ingin kita gunakan dalam panggilan HTTP POST. Selain itu, kita memerlukan penangan pendelegasian dalam aplikasi kita yang memeriksa header dan, jika ada, membuat panggilan ke metode HTTP yang ingin Anda panggil.

Sebelum kita menyelami implementasinya, mari kita lihat sekilas apa itu delegating handler dan mengapa kita menggunakannya di sini. Penangan pendelegasian dan penangan pesan lainnya dijalankan lebih awal di pipeline pemrosesan permintaan. Ini adalah kelas yang menerima permintaan HTTP dan mengembalikan respons HTTP. Penangan pendelegasian mirip dengan HttpModulesdi ASP.Net. Tetapi tidak seperti HttpModules, penangan pendelegasian dapat dirantai: Satu penangan pendelegasian dapat merujuk penangan pendelegasian lainnya. Anda dapat mempelajari lebih lanjut tentang mendelegasikan penangan dari artikel saya sebelumnya, "Cara bekerja dengan penangan pesan di API Web."

Buat pengontrol API Web

Asumsikan bahwa Anda memiliki pengontrol API Web yang mirip dengan ini:

kelas publik AuthorsController: ApiController

    {

        // GET: api / penulis

        publik IEnumerable Get ()

        {

            kembalikan string baru [] {“Joydip”, “Kanjilal”};

        }

        // GET: api / penulis / 1

        string publik Dapatkan (int id)

        {

            mengembalikan "Joydip Kanjilal";

        }

        // POST api / author

        public void Post ([FromBody] Penulis nilai) {}

        // PUT api / penulis / 1

        public void Put (int id, [FromBody] Author value) {}

        // HAPUS api / author / 1

        public void Hapus (int id) {}

    }

Buat DelegatingHandler untuk X-HTTP-Method-Override

Sekarang mari kita implementasikan handler X-HTTP-Method-Override. Ini adalah penangan pesan, jadi seperti biasa ia harus memperluas DelegatingHandlerkelas.

kelas publik CustomMessageHandler: DelegatingHandler

    {

        string readonly [] httpMethodsList = {“HAPUS”, “KEPALA”, “PUT”};

        const string httpMethodOverrideheader;

        protected override Task SendAsync (permintaan HttpRequestMessage, CancellationToken cancellationToken)

        {

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

            {               

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

                if (httpMethodsList.Contains (httpMethod, StringComparer.InvariantCultureIgnoreCase))

                {                  

                    request.Method = HttpMethod baru (httpMethod);

                }

            }

            return base.SendAsync (request, cancellationToken);

        }

    }

Kode ini cukup jelas. Ia memeriksa HTTP POST yang memiliki header X-HTTP-Method-Override. Jika header ada dalam daftar metode, metode permintaan diubah.

Daftarkan DelegatingHandler

Langkah selanjutnya adalah mendaftarkan pawang. Anda dapat melakukannya dengan menambahkan penangan baru ini ke koleksi MessageHandlers di kelas WebApiConfig seperti yang ditunjukkan dalam cuplikan kode di bawah ini.

public static void Register (konfigurasi HttpConfiguration)

{

    config.MessageHandlers.Add (new CustomMessageHandler ());

     // Rute API Web

    config.MapHttpAttributeRoutes ();

     config.Routes.MapHttpRoute (

        name: “DefaultApi”,

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

        default: baru {id = RouteParameter.Optional}

    );

}

Alternatifnya, Anda dapat mendaftarkan penangan pendelegasian menggunakan Application_Startpenangan peristiwa di file Global.asax.cs seperti yang ditunjukkan di bawah ini.

void yang dilindungi Application_Start (pengirim objek, EventArgs e)

        {

            RegisterRoutes (RouteTable.Routes);

            GlobalConfiguration.Configuration.MessageHandlers.Add (new CustomMessageHandler ());

        }

Hanya itu yang harus Anda lakukan di sisi server. Di sisi klien, yaitu dari browser web, Anda harus memastikan bahwa Anda menambahkan tajuk pengganti seperti yang ditunjukkan pada potongan kode di bawah.

$ .ajax ({

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

  ketik: "POSTING",

  data: JSON.stringify (authorData),

  header: {

      “Content-Type”: “application / json”,

      “X-HTTP-Method-Override”: “PUT”},

})

Seperti yang Anda lihat di cuplikan kode sebelumnya, yang perlu Anda lakukan hanyalah menentukan metode HTTP yang ingin Anda panggil di header permintaan— X-HTTP-Method-Override : DELETEatau X-HTTP-Method-Override : PUT- lalu lakukan panggilan POST ke sumber daya Anda.