Visual Studio'da çalışan ve üretim IIS sunucusunda başarısız olan Web API2 uygulamalarının sorunlarını giderme

Bu belgede üretim IIS sunucusuna dağıtılan Web API2 uygulamalarıyla ilgili sorunları giderme adımları açıklanmaktadır. Yaygın HTTP 405 ve 501 hatalarını giderir.

Bu öğreticide kullanılan yazılım

Web API uygulamaları genellikle çeşitli HTTP fiilleri kullanır: GET, POST, PUT, DELETE ve bazen PATCH. Bununla birlikte, geliştiriciler bu fiillerin üretim IIS sunucularında başka bir IIS modülü tarafından uygulandığı durumlarla karşılaşabilir ve bu da Visual Studio'da veya geliştirme sunucusunda düzgün çalışan bir Web API denetleyicisinin üretim IIS sunucusuna dağıtıldığında HTTP 405 hatası döndüreceği bir duruma yol açabilir.

HTTP 405 hatalarının nedenleri

HTTP 405 hatalarıyla ilgili sorunları gidermeyi öğrenmenin ilk adımı, HTTP 405 hatasının gerçekte ne anlama geldiğini anlamaktır. HTTP için birincil idare belgesi, HTTP 405 durum kodunu Yönteme İzin Verilmiyor olarak tanımlayan RFC 2616'dır ve bu durum kodunu "request-URI ile tanımlanan kaynak için Request-Line belirtilen yönteme izin verilmediği" bir durum olarak açıklar. Başka bir deyişle, bir HTTP istemcisinin istediği BELIRLI URL için HTTP fiiline izin verilmez.

Kısa bir gözden geçirme olarak, RFC 2616, RFC 4918 ve RFC 5789'da tanımlanan en çok kullanılan HTTP yöntemlerinden birkaçı aşağıdadır:

HTTP Yöntemi Description
GET Bu yöntem bir URI'den veri almak için kullanılır ve büyük olasılıkla en çok kullanılan HTTP yöntemidir.
HEAD Bu yöntem GET yöntemine çok benzer, ancak istek URI'sinden verileri gerçekten almaz; yalnızca HTTP durumunu alır.
POST Bu yöntem genellikle URI'ye yeni veri göndermek için kullanılır; POST genellikle form verilerini göndermek için kullanılır.
PUT Bu yöntem genellikle URI'ye ham veri göndermek için kullanılır; PUT genellikle Web API uygulamalarına JSON veya XML verileri göndermek için kullanılır.
DELETE Bu yöntem, bir URI'den verileri kaldırmak için kullanılır.
OPTIONS Bu yöntem genellikle bir URI için desteklenen HTTP yöntemlerinin listesini almak için kullanılır.
KOPYALAMA TAŞıMA Bu iki yöntem WebDAV ile kullanılır ve amaçları açıklayıcıdır.
MKCOL Bu yöntem WebDAV ile kullanılır ve belirtilen URI'de bir koleksiyon (örneğin bir dizin) oluşturmak için kullanılır.
PROPFIND PROPPATCH Bu iki yöntem WebDAV ile kullanılır ve bir URI'nin özelliklerini sorgulamak veya ayarlamak için kullanılır.
KILIT KILIDINI AÇ Bu iki yöntem WebDAV ile kullanılır ve yazma sırasında istek URI'siyle tanımlanan kaynağı kilitlemek/kilidini açmak için kullanılır.
PATCH Bu yöntem, var olan bir HTTP kaynağını değiştirmek için kullanılır.

Bu HTTP yöntemlerinden biri sunucuda kullanılmak üzere yapılandırıldığında, sunucu HTTP durumu ve istek için uygun olan diğer verilerle yanıt verir. (Örneğin, bir GET yöntemi HTTP 200 Tamam yanıtı alabilir ve PUT yöntemi http 201 Oluşturuldu yanıtı alabilir.)

HTTP yöntemi sunucuda kullanılmak üzere yapılandırılmamışsa, sunucu http 501 Uygulanmadı hatasıyla yanıt verir.

Ancak, bir HTTP yöntemi sunucuda kullanılmak üzere yapılandırıldığında, ancak belirli bir URI için devre dışı bırakıldığında, sunucu bir HTTP 405 Yöntemine İzin Verilmiyor hatasıyla yanıt verir.

Örnek HTTP 405 hatası

Aşağıdaki örnek HTTP isteği ve yanıtı, HTTP istemcisinin bir web sunucusundaki Web API'sine değer koymaya çalıştığı ve sunucunun PUT yöntemine izin verilmediğini belirten bir HTTP hatası döndürdüğü bir durumu gösterir:

HTTP İsteği:

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

"Some Value"

HTTP Yanıtı:

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'."}

Bu örnekte, HTTP istemcisi bir web sunucusundaki Web API'si uygulamasının URL'sine geçerli bir JSON isteği gönderdi, ancak sunucu URL için PUT yöntemine izin verilmediğini belirten bir HTTP 405 hata iletisi döndürdü. Buna karşılık, istek URI'sinin Web API'sinin bir yoluyla eşleşmemesi durumunda sunucu http 404 Bulunamadı hatası döndürür.

HTTP 405 hatalarını çözme

Belirli bir HTTP fiiline izin verilmiyor olmasının birkaç nedeni vardır, ancak IIS'de bu hatanın önde gelen nedeni bir birincil senaryo vardır: aynı fiil/yöntem için birden çok işleyici tanımlanır ve işleyicilerden biri beklenen işleyicinin isteği işlemesini engelliyor. Açıklama yoluyla IIS,applicationHost.configve web.config dosyalarındaki sıra işleyicisi girişlerini temel alarak işleyicileri ilkten sona işler ve burada isteği işlemek için yol, fiil, kaynak vb. eşleşen ilk birleşimi kullanılır.

Aşağıdaki örnek, bir Web API uygulamasına veri göndermek için PUT yöntemi kullanılırken HTTP 405 hatası döndüren bir IIS sunucusu için applicationHost.configdosyasından bir alıntıdır. Bu alıntıda, birkaç HTTP işleyicisi tanımlanır ve her işleyicinin yapılandırıldığı farklı bir HTTP yöntemleri kümesi vardır. Listedeki son giriş, diğer işleyicilerin isteği inceleme şansı bulduktan sonra kullanılan varsayılan işleyici olan statik içerik işleyicisidir:

<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>

Yukarıdaki örnekte, ASP.NET için WebDAV işleyicisi ve Uzantısız URL İşleyicisi (Web API için kullanılır) ayrı HTTP yöntemleri listeleri için açıkça tanımlanmıştır. ISAPI DLL işleyicisinin tüm HTTP yöntemleri için yapılandırıldığını unutmayın, ancak bu yapılandırma mutlaka bir hataya neden olmaz. Ancak, HTTP 405 hatalarını giderirken bunun gibi yapılandırma ayarlarının dikkate alınması gerekir.

Yukarıdaki örnekte sorun ISAPI DLL işleyicisi değildi; aslında, sorun IIS sunucusu için applicationHost.config dosyasında tanımlanmadı; sorun, Web API uygulaması Visual Studio'da oluşturulduğunda web.config dosyasında yapılan bir girdiden kaynaklandı. Uygulamanın web.config dosyasından aşağıdaki alıntıda sorunun konumu gösterilir:

<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>

Bu alıntıda, ASP.NET için Uzantısız URL İşleyicisi, Web API uygulamasıyla kullanılacak ek HTTP yöntemlerini içerecek şekilde yeniden tanımlandı. Ancak, WebDAV işleyicisi için benzer bir HTTP yöntemleri kümesi tanımlandığından bir çakışma oluşur. Bu özel durumda, WebDAV işleyicisi, Web API'sini içeren web sitesi için devre dışı bırakılmış olsa bile IIS tarafından tanımlanır ve yüklenir. HTTP PUT isteğinin işlenmesi sırasında IIS, PUT fiili için tanımlandığından WebDAV modülünü çağırır. WebDAV modülü çağrıldığında, yapılandırmasını denetler ve devre dışı bırakıldığını görür, bu nedenle bir WebDAV isteğine benzeyen tüm istekler için http 405 Yöntemine İzin Verilmiyor hatası döndürür. Bu sorunu çözmek için Web API'si uygulamanızın tanımlandığı web sitesinin HTTP modülleri listesinden WebDAV'yi kaldırmanız gerekir. Aşağıdaki örnekte bunun nasıl görünebileceği gösterilmektedir:

<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>

Bu senaryo genellikle bir uygulama geliştirme ortamından IIS üretim ortamına yayımlandıktan sonra karşılaşılır ve bu durum işleyicilerin/modüllerin listesinin geliştirme ve üretim ortamlarınız arasında farklı olması nedeniyle oluşur. Örneğin, Web API uygulaması geliştirmek için Visual Studio 2012 veya sonraki bir sürümünü kullanıyorsanız, IIS Express test için varsayılan web sunucusudur. Bu geliştirme web sunucusu, bir sunucu ürününe gelen tam IIS işlevinin ölçeği azaltılmış bir sürümüdür ve bu geliştirme web sunucusu geliştirme senaryoları için eklenen birkaç değişiklik içerir. Örneğin, WebDAV modülü genellikle IIS'nin tam sürümünü çalıştıran bir üretim web sunucusuna yüklenir, ancak kullanımda olmayabilir. IIS'nin geliştirme sürümü (IIS Express), WebDAV modülünü yükler, ancak WebDAV modülü girdileri kasıtlı olarak açıklama satırı yapılır, bu nedenle IIS Express yüklemenize WebDAV işlevselliği eklemek için IIS Express yapılandırma ayarlarınızı özellikle değiştirmediğiniz sürece WebDAV modülü hiçbir zaman IIS Express yüklenmez. Sonuç olarak, web uygulamanız geliştirme bilgisayarınızda düzgün çalışabilir, ancak Web API uygulamanızı üretim IIS web sunucunuzda yayımladığınızda HTTP 405 hatalarıyla karşılaşabilirsiniz.

HTTP 501 hataları

  • Belirli işlevlerin sunucuda uygulanmadığını gösterir.
  • Genellikle IIS ayarlarınızda HTTP isteğiyle eşleşen bir işleyici tanımlanmadığı anlamına gelir:
    • Büyük olasılıkla IIS'de bir şeyin doğru yüklenmediğini veya
    • Belirli bir HTTP yöntemini destekleyen işleyiciler tanımlanmaması için IIS ayarlarınızı bir şey değiştirdi.

Bu sorunu çözmek için, karşılık gelen modül veya işleyici tanımları olmayan bir HTTP yöntemini kullanmaya çalışan herhangi bir uygulamayı yeniden yüklemeniz gerekir.

Özet

http 405 hataları, istenen URL için bir web sunucusu tarafından bir HTTP yöntemine izin verilmediğinde oluşur. Bu koşul genellikle belirli bir fiil için belirli bir işleyici tanımlandığında ve bu işleyici isteği işlemeyi beklediğiniz işleyiciyi geçersiz kıldığında görülür.