Web API 응용 프로그램을 게시 한 후 HTTP 405 오류 문제 해결Troubleshooting HTTP 405 errors after publishing Web API applications

이 자습서에는 프로덕션 웹 서버에 Web API 응용 프로그램을 게시 한 후 HTTP 405 오류를 해결 하는 방법을 설명 합니다.This tutorial describes how to troubleshoot HTTP 405 errors after publishing a Web API application to a production web server.

이 자습서에서 사용 되는 소프트웨어Software used in this tutorial

웹 API 응용 프로그램은 일반적으로 몇 가지 일반적인 HTTP 동사를 사용합니다. GET, POST, PUT, DELETE 및 경우에 따라 패치 합니다.Web API applications typically use several common HTTP verbs: GET, POST, PUT, DELETE, and sometimes PATCH. 즉, 개발자가 발생할 경우 이러한 동사 또는 Visual Studio 개발 서버에서 제대로 작동 하는 Web API 컨트롤러를 반환 하는 경우에는 해당 프로덕션 서버의 다른 IIS 모듈에 의해 구현 되는 위치는 HTTP 405 프로덕션 서버에 배포 하는 동안 오류가 발생 했습니다.That being said, developers may run into situations where those verbs are implemented by another IIS module on their production 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 server. 다행히이 문제는 쉽게 해결 하지만 문제가 발생 하는 이유와 설명은 보장 하는 확인 합니다.Fortunately this problem is easily resolved, but the resolution warrants an explanation of why the problem is occurring.

HTTP 405 오류 원인What causes HTTP 405 errors

HTTP 405 오류 문제 하는 방법을 배우는 첫 번째 단계에서 HTTP 405 오류 실제로 의미를 이해 하는 것입니다.The first step toward learning how to trouble HTTP 405 errors is to understand what an HTTP 405 error actually means. HTTP에 대 한 문서 주 제어 RFC 2616와 HTTP 405 상태 코드를 정의 하는 메서드를 사용할 수 없습니다, 상황으로이 상태 코드를 자세히 설명 하 고 있는 "메서드 에 지정 된 요청 줄 요청 URI로 식별 되는 리소스에 허용 되지 않습니다." 즉, HTTP 동사는 HTTP 클라이언트 요청에 특정 URL에 허용 되지 않습니다.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.

간략 한 검토 결과 대부분 사용 되는 HTTP 메서드의 여러 RFC 2616, RFC 4918 및 RFC 5789에 정의 된 대로 다음과 같습니다.As a brief review, here are several of the most-used HTTP methods as defined in RFC 2616, RFC 4918, and RFC 5789:

HTTP 메서드HTTP Method 설명Description
GETGET 이 메서드는 데이터를 검색할 URI에서 아마도 가장 사용 되는 HTTP 메서드가 사용 됩니다.This method is used to retrieve data from a URI, and it probably the most-used HTTP method.
HEADHEAD 이 메서드는 요청 URI에서에서 데이터를 실제로 검색 하지 해당-HTTP 상태를 간단히 검색 한다는 점을 제외 하면 GET 메서드의 경우와 비슷하게 합니다.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 이 메서드는 일반적으로 데 URI;에 새 데이터를 전송 합니다. POST는 양식 데이터를 전송할 자주 사용 됩니다.This method is typically used to send new data to the URI; POST is often used to submit form data.
PUTPUT 이 메서드는 일반적으로 데; URI에서 원시 데이터 보내기 PUT는 Web API 응용 프로그램에 JSON 또는 XML 데이터를 전송할 자주 사용 됩니다.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 이 메서드는 URI에서 데이터를 제거 하려면 사용 됩니다.This method is used to remove data from a URI.
옵션OPTIONS 이 메서드는 URI에 대해 지원 되는 HTTP 메서드 목록을 검색 하려면 일반적으로 사용 됩니다.This method is typically used to retrieve the list of HTTP methods that are supported for a URI.
복사 이동COPY MOVE 그 목적은 쉽게 이해할 수 및 WebDAV를 사용 하 여 이러한 두 가지 방법을 사용 됩니다.These two methods are used with WebDAV, and their purpose is self-explanatory.
MKCOLMKCOL WebDAV를 사용 하 여이 메서드를 사용 하 고 지정된 된 URI의 컬렉션 (예: 디렉터리)를 만드는 데 사용 됩니다.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 WebDAV를 사용 하 여 이러한 두 메서드는 사용 및 사용 되는 쿼리 또는 URI에 대 한 속성을 설정 합니다.These two methods are used with WebDAV, and they are used to query or set properties for a URI.
잠금을 해제LOCK UNLOCK WebDAV를 사용 하 여 이러한 두 메서드가 사용 됩니다 하 고 작성 하는 경우 요청 URI에 의해 식별 되는 리소스 잠금/잠금 해제 하는 데 사용 됩니다.These two methods are used with WebDAV, and they are used to lock/unlock the resource identified by the request URI when authoring.
PATCHPATCH 이 메서드는 기존 HTTP 리소스를 수정 하려면 사용 됩니다.This method is used to modify an existing HTTP resource.

HTTP 메서드 중 하나는 서버에서 사용 하기 위해 구성 되 면 서버가 HTTP 상태 및 요청에 대 한 적절 한 기타 데이터를 사용 하 여 응답 합니다.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. (예를 들어 GET 메서드는 HTTP 200 나타날 확인 응답 및 PUT 메서드를 HTTP 201 나타날 Created 응답 합니다.)(For example, a GET method might receive an HTTP 200 OK response, and a PUT method might receive an HTTP 201 Created response.)

서버는 HTTP 501를 사용 하 여 응답할 HTTP 메서드는 서버에서 사용 하기 위해 구성 되지 않은 경우 구현 되지 오류입니다.If the HTTP method is not configured for use on the server, the server will respond with an HTTP 501 Not Implemented error.

그러나 HTTP 메서드를 서버에서 사용 하도록 구성 된 지정한 URI에 대 한 비활성화 된 경우 서버는 응답을 보냅니다는 HTTP 405 메서드를 사용할 수 없습니다 오류입니다.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.

예제에서는 HTTP 405 오류Example HTTP 405 error

다음 예제에서는 HTTP 요청 및 응답 있는 웹 서버에서 Web API 응용 프로그램에 값을 배치 하기 위해 시도 하는 HTTP 클라이언트 및 서버 상태 PUT 메서드를 사용할 수 있는 HTTP 오류를 반환 합니다. 상황을 보여 줍니다.The following example HTTP request and response illustrate a situation where an HTTP client is attempting to PUT value to a Web API application on a web server, and the server returns an HTTP error which states that the PUT method is not allowed:

HTTP 요청:HTTP Request:

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

"Some Value"

HTTP 응답: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'."}

이 예제에서는 HTTP 클라이언트는 유효한 JSON 요청 웹 서버에 있는 Web API 응용 프로그램에 대 한 URL을 보냈지만 서버 URL에 대 한 PUT 메서드를 허용 되지 않음을 나타내는 HTTP 405 오류 메시지를 반환 합니다.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. 반면, 요청 URI는 Web API 응용 프로그램에 대 한 경로 일치 하지 않은 서버 반환을 HTTP 404 찾지 오류입니다.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 오류 해결Resolve HTTP 405 errors

이유는 특정 HTTP 동사를 사용할 수 없는, 하지만 IIS에서이 오류의 주요 원인입니다. 한 가지 주요 시나리오는 여러 가지가 있습니다: 동일한 동사/메서드에 대 한 처리기를 여러 개 정의 되어 있고에서 예상 되는 처리기를 차단 하는 처리기 중 하나 요청을 처리 합니다.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. 통해 IIS에서 마지막으로 항목을 기준으로 순서 처리기 경로, 동사, 리소스 등의 첫 번째 일치 하는 조합을 사용 하는 요청을 처리 하는 위치 applicationHost.config 및 web.config 파일에서 첫 번째 처리기를 처리 합니다.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.

다음 예제에서는 PUT 메서드를 사용 하 여 Web API 응용 프로그램에 데이터를 전송할 때에서 HTTP 405 오류를 반환 된 IIS 서버에 대 한 applicationHost.config 파일에서 발췌 한 경우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. 이 발췌에서 여러 HTTP 처리기 정의 및 각 처리기에는 다른 HTTP 메서드 집합을 구성 하는-목록의 마지막 항목은 다른 처리기는 chanc 전에 사용 되는 기본 처리기는 정적 콘텐츠 처리기 요청을 검사 하려면 e: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>

위의 예에서 WebDAV 처리기와 ASP.NET (웹 API에 대 한 사용 됨)에 대 한 확장명이 없는 URL 처리기 명확 하 게 별도 목록은 HTTP 메서드 정의 됩니다.In the above 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. 이 구성은 오류가 반드시 인해 하지 않지만 모든 HTTP 메서드에 대 한 ISAPI DLL 처리기 구성 되어 있는지를 참고 합니다.Note that the ISAPI DLL handler is configured for all HTTP methods, although this configuration will not necessarily cause an error. 그러나 HTTP 405 오류 문제 해결 시 고려해 야 할이 이와 같은 구성 설정입니다.However, configuration settings like this need to be considered when troubleshooting HTTP 405 errors.

위의 예제에서는 ISAPI DLL 처리기 문제가 아닙니다. 사실, 문제는 IIS 서버에 대 한 applicationHost.config 파일에서 정의 되지 않았습니다-Visual Studio에서 웹 API 응용 프로그램을 만들 때 web.config 파일에서 만든 항목으로 문제가 발생 했습니다.In the above 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. 응용 프로그램의 web.config 파일에서 발췌 한 다음 문제의 위치를 보여 줍니다.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>

이 발췌에서 ASP.NET에 대 한 확장명이 없는 URL 처리기는 Web API 응용 프로그램을 사용 하 여 사용할 추가 HTTP 메서드를 포함 하도록 재정의 됩니다.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. 그러나 HTTP 메서드 집합을 유사한 WebDAV 처리기에 대 한 정의 되므로 충돌이 발생 합니다.However, since a similar set of HTTP methods is defined for the WebDAV handler, a conflict occurs. 이 특정 예제의 WebDAV 처리기가 정의 되 고 웹 API 응용 프로그램을 포함 하는 웹 사이트에 대 한 WebDAV가 사용 하지 않도록 설정 하는 경우에 IIS에서 로드 합니다.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 요청을 처리 하는 동안에 PUT 동사가 정의 되므로 IIS WebDAV 모듈을 호출 합니다.During the processing of an HTTP PUT request, IIS calls the WebDAV module since it is defined for the PUT verb. WebDAV 모듈 호출 되 면 해당 구성을 확인 하 고는 HTTP 405 반환 하므로 비활성 상태임을 확인 메서드를 사용할 수 없습니다 WebDAV 요청을 유사 하는 모든 요청에 대 한 오류입니다.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. 이 문제를 해결 하려면 WebDAV 웹 API 응용 프로그램 정의 되어 있는 웹 사이트에 대 한 HTTP 모듈 목록에서 제거 해야 합니다.To resolve this issue, you should remove WebDAV from the list of HTTP modules for the website where your Web API application is defined. 다음 예제는 수 형태 보여 줍니다.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>

이 시나리오는 응용 프로그램은 개발 환경에서 프로덕션 환경에 게시 된 후 처리기/모듈 목록을 개발 환경과 프로덕션 환경이 다르기 때문에 이런에 종종 발생 합니다.This scenario is often encountered after an application is published from a development environment to a production environment, and this occurs because the list of handlers/modules is different between your development and production environments. 예를 들어, Visual Studio 2012를 사용 하는 경우 또는 Web API 응용 프로그램을 개발 하려면 나중에 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. 이 개발 웹 서버는 서버 제품에서 제공 되는 모든 IIS 기능을 축소 된 버전 및이 개발 웹 서버에는 개발 시나리오에 대 한 추가 된 몇 가지 변경 내용이 포함 되어 있습니다.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. 예를 들어, WebDAV 모듈 실제 사용에서 되지 않을 수 있습니다 하지만 자주 IIS의 전체 버전을 실행 하는 프로덕션 웹 서버에 설치 됩니다.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 actual use. 개발 버전의 IIS (IIS Express), WebDAV 모듈을 설치 하지만 WebDAV 모듈에 대 한 항목은 의도적으로 주석으로 WebDAV 모듈은 특히 IIS Express 구성을 변경 하지 않는 경우 IIS Express에서 로드 되지 않습니다 있도록 IIS Express 설치를 사용 하 여 WebDAV 기능을 추가 하려면 설정입니다.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. 결과적으로, 웹 응용 프로그램 개발 컴퓨터에 제대로 작동 않을 수 있지만 프로덕션 웹 서버에 Web API 응용 프로그램을 게시할 때 HTTP 405 오류를 발생할 수 있습니다.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 web server.

요약Summary

HTTP 405 오류는 요청된 된 URL의 HTTP 메서드를 웹 서버에서 허용 하지 않는 경우에 발생 합니다.HTTP 405 errors are caused when an HTTP method is not allowed by a web server for a requested URL. 이 문제는 주로 특정 동사에 대 한 특정 처리기를 정의 되 고 해당 처리기는 요청을 처리 해야 하는 처리기를 재정의 하는 경우에 표시 됩니다.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.

특정 기능을 서버에서 구현 되지 않았음을 의미 하는 HTTP 501 오류 메시지를 받게 되는 상황이 발생 하면이 경우 대체로 처리기가 없는 IIS 설정에서 정의 된 HTTP 요청에 일치 하는 아마도 항목이 올바르게 시스템에 설치 되지 않은 또는 해당 지원 특정 HTTP 메서드를 정의 하는 처리기가 없는 IIS 설정을 변경 했습니다 것을 나타냅니다.If you encounter a situation where you receive an HTTP 501 error message, which means that the specific functionality has not been implemented on the server, this often means that there is no handler defined in your IIS settings which matches the HTTP request, which probably indicates that something was not installed correctly on your system, or something has modified your IIS settings so that there are no handlers defined that support the specific HTTP method. 해당 문제를 해결 하려면 해당 모듈 또는 처리기 정의 없습니다 있기 HTTP 메서드를 사용 하려고 시도 하는 응용 프로그램을 다시 설치 해야 합니다.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.