Visual Studio 'da çalışan ve üretim IIS sunucusunda başarısız olan Web API2 uygulamalarının sorunlarını gidermeTroubleshoot Web API2 apps that work in Visual Studio and fail on a production IIS server

Bu belgede, bir üretim IIS sunucusuna dağıtılan Web API2 uygulamalarının nasıl giderileceği açıklanmaktadır.This doc explains how to troubleshoot Web API2 apps that are deployed to a production IIS server. Ortak HTTP 405 ve 501 hatalarını ele alınmaktadır.It addresses common HTTP 405 and 501 errors.

Bu öğreticide kullanılan yazılımSoftware used in this tutorial

Web API Apps genellikle birkaç HTTP fiillerini kullanır: GET, POST, PUT, DELETE ve bazen PATCH.Web API apps typically use several HTTP verbs: GET, POST, PUT, DELETE, and sometimes PATCH. Bu şekilde, geliştiriciler, Visual Studio 'da veya bir geliştirme sunucusunda doğru şekilde çalışan bir Web API denetleyicisi olduğunda, bu fiillerin üretim IIS sunucusu üzerinde başka bir IIS modülü tarafından uygulandığı durumlara yol açabilir. üretim IIS sunucusuna dağıtıldığında bir HTTP 405 hatası döndürür.That being said, developers may run into situations where those verbs are implemented by another IIS module on their production IIS server, which leads to a situation where a Web API controller that works correctly in Visual Studio or on a development server will return an HTTP 405 error when it is deployed to a production IIS server.

HTTP 405 hatalarına neden olur?What causes HTTP 405 errors

HTTP 405 hatalarına nasıl sorun gidermeyi öğrenmekte olan ilk adım, bir HTTP 405 hatasının gerçekten ne anlama geldiğini anlamaktır.The first step toward learning how to troubleshoot HTTP 405 errors is to understand what an HTTP 405 error actually means. HTTP için birincil yöneten belge, HTTP 405 durum kodunu metodun Izin verilmeyenşekilde tanımlayan RFC 2616' dir ve bu durum kodunu, istek-satırında belirtilen yöntemin istek URI 'si tarafından tanımlanan kaynak için izin verilmeyen "bir durum olarak açıklar. diğer bir deyişle", http fiiline bir HTTP istemcisinin istediği özel URL için izin verilmez.The primary governing document for HTTP is RFC 2616, which defines the HTTP 405 status code as Method Not Allowed, and further describes this status code as a situation where "the method specified in the Request-Line is not allowed for the resource identified by the Request-URI." In other words, the HTTP verb is not allowed for the specific URL that an HTTP client has requested.

Kısa bir inceleme olarak, RFC 2616, RFC 4918 ve RFC 5789 ' de tanımlanan en çok kullanılan HTTP yöntemlerinden birkaçı aşağıda verilmiştir:As a brief review, here are several of the most-used HTTP methods as defined in RFC 2616, RFC 4918, and RFC 5789:

HTTP yöntemiHTTP Method AçıklamaDescription
GETGET 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.This method is used to retrieve data from a URI, and it probably the most-used HTTP method.
BAŞLıHEAD Bu yöntem GET yöntemine çok benzer, ancak gerçekte istek URI 'sinden veri almamaktır; yalnızca HTTP durumunu alır.This method is much like the GET method, except that it doesn't actually retrieve the data from the request URI - it simply retrieves the HTTP status.
POSTPOST Bu yöntem genellikle URI 'ye yeni veri göndermek için kullanılır; GÖNDERI genellikle form verileri göndermek için kullanılır.This method is typically used to send new data to the URI; POST is often used to submit form data.
PUTPUT Bu yöntem genellikle, URI 'ye ham veri göndermek için kullanılır; PUT, genellikle JSON veya XML verilerini Web API uygulamalarına göndermek için kullanılır.This method is typically used to send raw data to the URI; PUT is often used to submit JSON or XML data to Web API applications.
DELETEDELETE Bu yöntem, bir URI 'den verileri kaldırmak için kullanılır.This method is used to remove data from a URI.
SeçeneklerOPTIONS Bu yöntem, genellikle bir URI için desteklenen HTTP yöntemlerinin listesini almak için kullanılır.This method is typically used to retrieve the list of HTTP methods that are supported for a URI.
TAŞıMA KOPYALACOPY MOVE Bu iki yöntem WebDAV ile kullanılır ve kendi amacı kendi kendine açıklayıcıdır.These two methods are used with WebDAV, and their purpose is self-explanatory.
MKCOLMKCOL Bu yöntem, WebDAV ile kullanılır ve belirtilen URI 'de bir koleksiyon (ör. bir dizin) oluşturmak için kullanılır.This method is used with WebDAV, and it is used to create a collection (e.g. a directory) at the specified URI.
PROPFIND PROPPATCHPROPFIND PROPPATCH Bu iki yöntem WebDAV ile kullanılır ve bir URI 'nin özelliklerini sorgulamak veya ayarlamak için kullanılır.These two methods are used with WebDAV, and they are used to query or set properties for a URI.
KILIT KILIDINI KILITLELOCK UNLOCK Bu iki yöntem WebDAV ile kullanılır ve yazma sırasında istek URI 'SI tarafından tanımlanan kaynağı kilitlemek/kilidini açmak için kullanılır.These two methods are used with WebDAV, and they are used to lock/unlock the resource identified by the request URI when authoring.
DÜZELTMESIPATCH Bu yöntem, var olan bir HTTP kaynağını değiştirmek için kullanılır.This method is used to modify an existing HTTP resource.

Bu HTTP yöntemlerinden biri sunucuda kullanılmak üzere yapılandırıldığında, sunucu, istek için uygun olan HTTP durumu ve diğer verilerle yanıt verir.When one of these HTTP methods is configured for use on the server, the server will respond with the HTTP status and other data that is appropriate for the request. (Örneğin, bir GET yöntemi bir HTTP 200 ok yanıtı alabılır ve put YÖNTEMI bir http 201 oluşturma yanıtı alabilir.)(For example, a GET method might receive an HTTP 200 OK response, and a PUT method might receive an HTTP 201 Created response.)

HTTP yöntemi sunucuda kullanılmak üzere yapılandırılmamışsa sunucu, bir HTTP 501 uygulanmamış hatasıyla yanıt verir.If the HTTP method is not configured for use on the server, the server will respond with an HTTP 501 Not Implemented error.

Ancak, bir HTTP yöntemi sunucuda kullanılmak üzere yapılandırıldığında, ancak belirli bir URI için devre dışı bırakılmışsa, sunucu bir HTTP 405 yöntemi Izin verilmeyen hatasıyla yanıt verir.However, when an HTTP method is configured for use on the server, but it has been disabled for a given URI, the server will respond with an HTTP 405 Method Not Allowed error.

Örnek HTTP 405 hatasıExample HTTP 405 error

Aşağıdaki örnek HTTP isteği ve yanıtı, bir HTTP istemcisinin Web sunucusundaki bir Web API uygulamasına değer koymaya çalıştığı ve sunucu PUT yöntemine izin verilmediğini bildiren bir HTTP hatası döndüren bir durumu gösterir:The following example HTTP request and response illustrate a situation where an HTTP client is attempting to PUT value to a Web API app on a web server, and the server returns an HTTP error which states that the PUT method is not allowed:

HTTP Isteği:HTTP Request:

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

"Some Value"

HTTP yanıtı:HTTP Response:

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 Web sunucusundaki bir Web API uygulaması URL 'sine geçerli bir JSON isteği gönderdi, ancak sunucu, PUT yöntemine URL için izin verilmediğini belirten bir HTTP 405 hata iletisi döndürdü.In this example, the HTTP client sent a valid JSON request to the URL for a Web API application on a web server, but the server returned an HTTP 405 error message which indicates that the PUT method was not allowed for the URL. Buna karşılık, istek URI 'SI Web API uygulaması için bir yol ile eşleşmezse, sunucu bir HTTP 404 bulunamadı hatası döndürür.In contrast, if the request URI did not match a route for the Web API application, the server would return an HTTP 404 Not Found error.

HTTP 405 hatalarını çözümlemeResolve HTTP 405 errors

Belirli bir HTTP fiiline izin verilmemesine neden olan bazı nedenler vardır, ancak IIS 'de bu hatanın önde gelen nedeni olan bir birincil senaryo vardır: aynı fiil/Yöntem için birden çok işleyici tanımlanmıştır ve işleyicilerden biri beklenen İşleyicinin isteği işlemesini engelliyor.There are several reasons why a specific HTTP verb may not be allowed, but there is one primary scenario that is the leading cause of this error in IIS: multiple handlers are defined for the same verb/method, and one of the handlers is blocking the expected handler from processing the request. Açıklama yoluyla IIS,, isteği işlemek için ilk eşleşen yol, fiil, kaynak, vb. bileşiminin, ApplicationHost. config ve Web. config dosyalarındaki Order Handler girişlerine göre ilk olarak işleyicileri işler.By way of explanation, IIS processes handlers from first to last based on the order handler entries in the applicationHost.config and web.config files, where the first matching combination of path, verb, resource, etc., will be used to handle the request.

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 bir ApplicationHost. config dosyasından alıntıdır.The following example is an excerpt from an applicationHost.config file for an IIS server that was returning an HTTP 405 error when using the PUT method to submit data to a Web API application. Bu alıntıda, bazı HTTP işleyicileri tanımlanmıştır ve her işleyicinin yapılandırıldığı farklı bir HTTP yöntemi kümesi vardır; listedeki son giriş, diğer işleyiciler bir chanc olduktan sonra kullanılan varsayılan işleyici olan statik içerik işleyicisidir. e-isteği incelemek için:In this excerpt, several HTTP handlers are defined, and each handler has a different set of HTTP methods for which it is configured - the last entry in the list is the static content handler, which is the default handler that is used after the other handlers have had a chance to examine the request:

<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, WebDAV işleyicisi ve ASP.NET için uzantı-daha seyrek URL Işleyicisi (Web API 'SI için kullanılır), HTTP yöntemlerinin ayrı listeleri için açıkça tanımlanmıştır.In the preceding example, the WebDAV handler and the Extension-less URL Handler for ASP.NET (which is used for Web API) are clearly defined for separate lists of HTTP methods. ISAPI DLL işleyicisinin tüm HTTP yöntemleri için yapılandırıldığını, ancak bu yapılandırmanın hataya neden olamayacağını unutmayın.Note that the ISAPI DLL handler is configured for all HTTP methods, although this configuration will not necessarily cause an error. Ancak, bunun gibi yapılandırma ayarlarının HTTP 405 hatalarıyla ilgili sorunları giderirken dikkate almanız gerekir.However, configuration settings like this need to be considered when troubleshooting HTTP 405 errors.

Yukarıdaki örnekte, ISAPI DLL işleyicisi sorun değildi; Aslında, sorun IIS sunucusu için ApplicationHost. config dosyasında tanımlı değildi-sorun, Web API uygulaması Visual Studio 'da oluşturulduğunda Web. config dosyasında yapılan bir girdinin kaynaklanmasından kaynaklandı.In the preceding example, the ISAPI DLL handler was not the problem; in fact, the problem was not defined in the applicationHost.config file for the IIS server - the problem was caused by an entry that was made in the web.config file when the Web API application was created in Visual Studio. Uygulamanın Web. config dosyasındaki aşağıdaki alıntıda sorunun konumunu gösterir:The following excerpt from the application's web.config file shows the location of the problem:

<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ı-daha az URL Işleyicisi, Web API uygulamasıyla kullanılacak ek HTTP yöntemlerini içerecek şekilde yeniden tanımlanır.In this excerpt, the Extension-less URL Handler for ASP.NET is redefined to include additional HTTP methods that will be used with the Web API application. Ancak, WebDAV işleyicisi için benzer bir HTTP yöntemleri kümesi tanımlandığından, bir çakışma oluşur.However, since a similar set of HTTP methods is defined for the WebDAV handler, a conflict occurs. Bu özel durumda, WebDAV işleyicisi, Web API uygulamasını içeren Web sitesi için WebDAV devre dışı bırakılmış olsa bile IIS tarafından tanımlanır ve yüklenir.In this specific case, the WebDAV handler is defined and loaded by IIS, even though WebDAV is disabled for the website that includes the Web API application. HTTP PUT isteğinin işlenmesi sırasında, IIS, PUT fiili için tanımlandığından WebDAV modülünü çağırır.During the processing of an HTTP PUT request, IIS calls the WebDAV module since it is defined for the PUT verb. WebDAV modülü çağrıldığında, yapılandırmasını denetler ve devre dışı olduğunu görür, bu nedenle bir WebDAV isteğine benzer bir istek için bir HTTP 405 yöntemi Izin verilmeyen bir hata döndürür.When the WebDAV module is called, it checks its configuration and sees that it is disabled, so it will return an HTTP 405 Method Not Allowed error for any request that resembles a WebDAV request. Bu sorunu çözmek için, Web API uygulamanızın tanımlandığı Web sitesinin HTTP modülleri listesinden WebDAV 'yi kaldırmanız gerekir.To resolve this issue, you should remove WebDAV from the list of HTTP modules for the website where your Web API application is defined. Aşağıdaki örnek, şöyle görünebileceğini gösterir:The following example shows what that might look like:

<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 bir IIS üretim ortamına yayımlandıktan sonra ve bu durum, işleyiciler/modüller listesi geliştirme ve üretim ortamlarınız arasında farklılık yaptığından oluşur.This scenario is often encountered after an application is published from a development environment to an IIS production environment, and this occurs because the list of handlers/modules is different between your development and production environments. Örneğin, bir Web API uygulaması geliştirmek için Visual Studio 2012 veya üstünü kullanıyorsanız, test için varsayılan Web sunucusudur IIS Express.For example, if you are using Visual Studio 2012 or later to develop a Web API application, IIS Express is the default web server for testing. Bu geliştirme Web sunucusu, bir sunucu ürününde sunulan tam IIS işlevselliğinin ölçeği genişletilmiş bir sürümüdür ve bu geliştirme Web sunucusu geliştirme senaryoları için eklenen birkaç değişiklik içerir.This development web server is a scaled-down version of the full IIS functionality that ships in a server product, and this development web server contains a few changes that were added for development scenarios. Ö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.For example, the WebDAV module is often installed on a production web server that is running the full version of IIS, although it may not be in use. IIS 'nin geliştirme sürümü (IIS Express), WebDAV modülünü yüklerse, ancak WebDAV modülünün girişleri bilinçli olarak önceden belirlenir, bu nedenle IIS Express yapılandırmanızı özellikle değiştirmediğiniz müddetçe WebDAV modülü IIS Express hiçbir şekilde yüklenmez IIS Express yüklemenize WebDAV işlevselliği ekleme ayarları.The development version of IIS, (IIS Express), installs the WebDAV module, but the entries for the WebDAV module are intentionally commented out, so the WebDAV module is never loaded on IIS Express unless you specifically alter your IIS Express configuration settings to add WebDAV functionality to your IIS Express installation. Sonuç olarak, Web uygulamanız geliştirme bilgisayarınızda düzgün çalışabilir, ancak Web API uygulamanızı üretim IIS Web sunucunuza yayımladığınızda HTTP 405 hatalarıyla karşılaşabilirsiniz.As a result, your web application may work correctly on your development computer, but you may encounter HTTP 405 errors when you publish your Web API application to your production IIS web server.

HTTP 501 hatalarıHTTP 501 errors

  • Belirli işlevlerin sunucuda uygulanmadığını gösterir.Indicates the specific functionality has not been implemented on the server.
  • Genellikle IIS ayarlarınızda tanımlanmış, HTTP isteğiyle eşleşen bir işleyici olmadığı anlamına gelir:Typically means that there is no handler defined in your IIS settings which matches the HTTP request:
    • Büyük olasılıkla IIS 'de bir şeyin doğru yüklenmediğini belirtiyorProbably indicates that something was not installed correctly on IIS or
    • IIS ayarlarınızı, belirli HTTP yöntemini destekleyen hiçbir işleyici tanımlanmadığı şekilde değiştirdi.Something has modified your IIS settings so that there are no handlers defined that support the specific HTTP method.

Bu sorunu çözmek için, karşılık gelen bir modüle veya işleyici tanımına sahip olmayan bir HTTP yöntemini kullanmaya çalışan herhangi bir uygulamayı yeniden yüklemeniz gerekir.To resolve that issue, you would need to reinstall any application that is attempting to use an HTTP method for which it has no corresponding module or handler definitions.

ÖzetSummary

HTTP 405 hataları, bir HTTP yöntemine istenen URL için bir Web sunucusu tarafından izin verilmediği zaman neden olur.HTTP 405 errors are caused when an HTTP method is not allowed by a web server for a requested URL. Bu durum genellikle belirli bir fiil için belirli bir işleyici tanımlandığında ve bu işleyici isteği işlemeyi düşündüğünüz işleyiciyi geçersiz kılıyorsa görülür.This condition is often seen when a particular handler has been defined for a specific verb, and that handler is overriding the handler that you expect to process the request.