Bagikan melalui


Memecahkan masalah aplikasi Web API2 yang berfungsi di Visual Studio dan gagal di server IIS produksi

Dokumen ini menjelaskan cara memecahkan masalah aplikasi Web API2 yang disebarkan ke server IIS produksi. Ini mengatasi kesalahan UMUM HTTP 405 dan 501.

Perangkat lunak yang digunakan dalam tutorial ini

Aplikasi API Web biasanya menggunakan beberapa kata kerja HTTP: GET, POST, PUT, DELETE, dan terkadang PATCH. Meskipun demikian, pengembang dapat mengalami situasi di mana kata kerja tersebut diimplementasikan oleh modul IIS lain di server IIS produksi mereka, yang mengarah ke situasi di mana pengontrol API Web yang berfungsi dengan benar di Visual Studio atau di server pengembangan akan mengembalikan kesalahan HTTP 405 ketika disebarkan ke server IIS produksi.

Apa yang menyebabkan kesalahan HTTP 405

Langkah pertama untuk mempelajari cara memecahkan masalah kesalahan HTTP 405 adalah memahami apa arti kesalahan HTTP 405 sebenarnya. Dokumen utama yang mengatur untuk HTTP adalah RFC 2616, yang mendefinisikan kode status HTTP 405 sebagai Metode Tidak Diizinkan, dan lebih lanjut menjelaskan kode status ini sebagai situasi di mana "metode yang ditentukan dalam Request-Line tidak diizinkan untuk sumber daya yang diidentifikasi oleh Request-URI." Dengan kata lain, kata kerja HTTP tidak diizinkan untuk URL tertentu yang diminta klien HTTP.

Sebagai ulasan singkat, berikut adalah beberapa metode HTTP yang paling banyak digunakan seperti yang didefinisikan dalam RFC 2616, RFC 4918, dan RFC 5789:

Metode HTTP Deskripsi
GET Metode ini digunakan untuk mengambil data dari URI, dan mungkin metode HTTP yang paling banyak digunakan.
HEAD Metode ini mirip dengan metode GET, kecuali bahwa metode tersebut tidak benar-benar mengambil data dari URI permintaan - metode ini hanya mengambil status HTTP.
KIRIM Metode ini biasanya digunakan untuk mengirim data baru ke URI; POST sering digunakan untuk mengirimkan data formulir.
PUT Metode ini biasanya digunakan untuk mengirim data mentah ke URI; PUT sering digunakan untuk mengirimkan data JSON atau XML ke aplikasi Web API.
DELETE Metode ini digunakan untuk menghapus data dari URI.
OPSI Metode ini biasanya digunakan untuk mengambil daftar metode HTTP yang didukung untuk URI.
SALIN PEMINDAHAN Kedua metode ini digunakan dengan WebDAV, dan tujuannya sendiri jelas.
MKCOL Metode ini digunakan dengan WebDAV, dan digunakan untuk membuat koleksi (misalnya direktori) di URI yang ditentukan.
PROPFIND PROPPATCH Kedua metode ini digunakan dengan WebDAV, dan digunakan untuk mengkueri atau mengatur properti untuk URI.
KUNCI BUKA KUNCI Kedua metode ini digunakan dengan WebDAV, dan digunakan untuk mengunci/membuka kunci sumber daya yang diidentifikasi oleh URI permintaan saat penulisan.
PATCH Metode ini digunakan untuk mengubah sumber daya HTTP yang ada.

Ketika salah satu metode HTTP ini dikonfigurasi untuk digunakan di server, server akan merespons dengan status HTTP dan data lain yang sesuai untuk permintaan tersebut. (Misalnya, metode GET mungkin menerima respons HTTP 200 OK , dan metode PUT mungkin menerima respons HTTP 201 Created .)

Jika metode HTTP tidak dikonfigurasi untuk digunakan di server, server akan merespons dengan kesalahan HTTP 501 Tidak Diterapkan .

Namun, ketika metode HTTP dikonfigurasi untuk digunakan di server, tetapi telah dinonaktifkan untuk URI tertentu, server akan merespons dengan kesalahan Metode HTTP 405 Tidak Diizinkan .

Contoh kesalahan HTTP 405

Contoh permintaan dan respons HTTP berikut mengilustrasikan situasi di mana klien HTTP mencoba menempatkan nilai ke aplikasi API Web di server web, dan server mengembalikan kesalahan HTTP yang menyatakan bahwa metode PUT tidak diizinkan:

Permintaan HTTP:

PUT /api/values/1 HTTP/1.1
Content-type: application/json
Host: localhost
Accept: */*
Content-Length: 12

"Some Value"

Respons HTTP:

HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-Powered-By: ASP.NET
Date: Wed, 15 May 2013 02:38:57 GMT
Content-Length: 72

{"Message":"The requested resource does not support http method 'PUT'."}

Dalam contoh ini, klien HTTP mengirim permintaan JSON yang valid ke URL untuk aplikasi Api Web di server web, tetapi server mengembalikan pesan kesalahan HTTP 405 yang menunjukkan bahwa metode PUT tidak diizinkan untuk URL. Sebaliknya, jika URI permintaan tidak cocok dengan rute untuk aplikasi Api Web, server akan mengembalikan kesalahan HTTP 404 Tidak Ditemukan .

Mengatasi kesalahan HTTP 405

Ada beberapa alasan mengapa kata kerja HTTP tertentu mungkin tidak diizinkan, tetapi ada satu skenario utama yang merupakan penyebab utama kesalahan ini di IIS: beberapa handler didefinisikan untuk kata kerja/metode yang sama, dan salah satu handler memblokir handler yang diharapkan dari pemrosesan permintaan. Dengan cara penjelasan, IIS memproses handler dari pertama hingga terakhir berdasarkan entri handler pesanan dalam file applicationHost.config dan web.config , di mana kombinasi pencocokan pertama jalur, kata kerja, sumber daya, dll., akan digunakan untuk menangani permintaan.

Contoh berikut adalah kutipan dari file applicationHost.config untuk server IIS yang mengembalikan kesalahan HTTP 405 saat menggunakan metode PUT untuk mengirimkan data ke aplikasi Api Web. Dalam kutipan ini, beberapa handler HTTP didefinisikan, dan setiap handler memiliki serangkaian metode HTTP yang berbeda yang dikonfigurasi - entri terakhir dalam daftar adalah handler konten statis, yang merupakan handler default yang digunakan setelah handler lain memiliki kesempatan untuk memeriksa permintaan:

<handlers accessPolicy="Read, Script">
   <add name="WebDAV"
      path="*"
      verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK"
      modules="WebDAVModule"
      resourceType="Unspecified"
      requireAccess="None" />
   <add name="ISAPI-dll"
      path="*.dll"
      verb="*"
      modules="IsapiModule"
      resourceType="File"
      requireAccess="Execute"
      allowPathInfo="true" />
   <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"
      path="*."
      verb="GET,HEAD,POST,DEBUG"
      modules="IsapiModule"
      scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll"
      preCondition="classicMode,runtimeVersionv4.0,bitness64"
      responseBufferLimit="0" />

   <!-- Additional handlers will be defined here. -->

   <add name="StaticFile"
      path="*"
      verb="*"
      modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule"
      resourceType="Either"
      requireAccess="Read" />
</handlers>

Dalam contoh sebelumnya, handler WebDAV dan Extension-less URL Handler untuk ASP.NET (yang digunakan untuk Web API) didefinisikan dengan jelas untuk daftar terpisah metode HTTP. Perhatikan bahwa handler ISAPI DLL dikonfigurasi untuk semua metode HTTP, meskipun konfigurasi ini tidak akan selalu menyebabkan kesalahan. Namun, pengaturan konfigurasi seperti ini perlu dipertimbangkan saat memecahkan masalah kesalahan HTTP 405.

Dalam contoh sebelumnya, handler ISAPI DLL bukan masalah; bahkan, masalahnya tidak didefinisikan dalam file applicationHost.config untuk server IIS - masalahnya disebabkan oleh entri yang dibuat dalam file web.config ketika aplikasi Api Web dibuat di Visual Studio. Kutipan berikut dari file web.config aplikasi menunjukkan lokasi masalah:

<handlers accessPolicy="Read, Script">
   <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
   <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"
      path="*."
      verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
      modules="IsapiModule"
      scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll"
      preCondition="classicMode,runtimeVersionv4.0,bitness64"
      responseBufferLimit="0" />
</handlers>

Dalam kutipan ini, Handler URL tanpa Ekstensi untuk ASP.NET didefinisikan ulang untuk menyertakan metode HTTP tambahan yang akan digunakan dengan aplikasi API Web. Namun, karena sekumpulan metode HTTP serupa didefinisikan untuk handler WebDAV, konflik terjadi. Dalam kasus khusus ini, handler WebDAV ditentukan dan dimuat oleh IIS, meskipun WebDAV dinonaktifkan untuk situs web yang menyertakan aplikasi Web API. Selama pemrosesan permintaan HTTP PUT, IIS memanggil modul WebDAV karena ditentukan untuk kata kerja PUT. Ketika modul WebDAV dipanggil, modul memeriksa konfigurasinya dan melihat bahwa modul tersebut dinonaktifkan, sehingga akan mengembalikan kesalahan Metode HTTP 405 Tidak Diizinkan untuk permintaan apa pun yang menyerupai permintaan WebDAV. Untuk mengatasi masalah ini, Anda harus menghapus WebDAV dari daftar modul HTTP untuk situs web tempat aplikasi API Web Anda ditentukan. Contoh berikut menunjukkan seperti apa tampilannya:

<handlers accessPolicy="Read, Script">
   <remove name="WebDAV" />
   <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
   <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"
      path="*."
      verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
      modules="IsapiModule"
      scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll"
      preCondition="classicMode,runtimeVersionv4.0,bitness64"
      responseBufferLimit="0" />
</handlers>

Skenario ini sering ditemui setelah aplikasi diterbitkan dari lingkungan pengembangan ke lingkungan produksi IIS, dan ini terjadi karena daftar handler/modul berbeda antara lingkungan pengembangan dan produksi Anda. Misalnya, jika Anda menggunakan Visual Studio 2012 atau yang lebih baru untuk mengembangkan aplikasi Api Web, IIS Express adalah server web default untuk pengujian. Server web pengembangan ini adalah versi yang diperkecil dari fungsionalitas IIS lengkap yang dikirim dalam produk server, dan server web pengembangan ini berisi beberapa perubahan yang ditambahkan untuk skenario pengembangan. Misalnya, modul WebDAV sering diinstal pada server web produksi yang menjalankan versi lengkap IIS, meskipun mungkin tidak digunakan. Versi pengembangan IIS, (IIS Express), menginstal modul WebDAV, tetapi entri untuk modul WebDAV sengaja dikomentari, sehingga modul WebDAV tidak pernah dimuat di IIS Express kecuali Anda secara khusus mengubah pengaturan konfigurasi IIS Express Anda untuk menambahkan fungsionalitas WebDAV ke penginstalan IIS Express Anda. Akibatnya, aplikasi web Anda dapat bekerja dengan benar di komputer pengembangan Anda, tetapi Anda mungkin mengalami kesalahan HTTP 405 saat Anda menerbitkan aplikasi Api Web ke server web IIS produksi Anda.

Kesalahan HTTP 501

  • Menunjukkan fungsionalitas tertentu belum diimplementasikan pada server.
  • Biasanya berarti bahwa tidak ada handler yang ditentukan dalam pengaturan IIS Anda yang cocok dengan permintaan HTTP:
    • Mungkin menunjukkan bahwa sesuatu tidak diinstal dengan benar di IIS atau
    • Sesuatu telah memodifikasi pengaturan IIS Anda sehingga tidak ada penangan yang ditentukan yang mendukung metode HTTP tertentu.

Untuk mengatasi masalah tersebut, Anda harus menginstal ulang aplikasi apa pun yang mencoba menggunakan metode HTTP yang tidak memiliki definisi modul atau penangan yang sesuai.

Ringkasan

Kesalahan HTTP 405 disebabkan ketika metode HTTP tidak diizinkan oleh server web untuk URL yang diminta. Kondisi ini sering terlihat ketika handler tertentu telah didefinisikan untuk kata kerja tertentu, dan handler tersebut mengambil alih handler yang Anda harapkan untuk memproses permintaan.