다음을 통해 공유


Visual Studio에서 작동하고 프로덕션 IIS 서버에서 실패하는 Web API2 앱 문제 해결

이 문서에서는 프로덕션 IIS 서버에 배포된 Web API2 앱 문제를 해결하는 방법을 설명합니다. 일반적인 HTTP 405 및 501 오류를 해결합니다.

이 자습서에서 사용되는 소프트웨어

Web API 앱은 일반적으로 GET, POST, PUT, DELETE 및 경우에 따라 PATCH와 같은 여러 HTTP 동사를 사용합니다. 즉, 개발자는 프로덕션 IIS 서버의 다른 IIS 모듈에서 동사를 구현하는 상황이 발생할 수 있으며, 이로 인해 Visual Studio 또는 개발 서버에서 올바르게 작동하는 Web API 컨트롤러가 프로덕션 IIS 서버에 배포될 때 HTTP 405 오류를 반환하는 상황이 발생할 수 있습니다.

HTTP 405 오류의 원인

HTTP 405 오류 문제를 해결하는 방법을 알아보는 첫 번째 단계는 HTTP 405 오류가 실제로 의미하는 바를 이해하는 것입니다. HTTP에 대한 기본 관리 문서는 RFC 2616으로, HTTP 405 상태 코드를 메서드 허용 안 됨으로 정의하고 이 상태 코드를 "Request-Line 지정된 메서드가 Request-URI로 식별된 리소스에 대해 허용되지 않는 상황"으로 설명합니다. 즉, HTTP 클라이언트가 요청한 특정 URL에는 HTTP 동사가 허용되지 않습니다.

간단한 검토로 RFC 2616, RFC 4918 및 RFC 5789에 정의된 가장 많이 사용되는 HTTP 메서드는 다음과 같습니다.

HTTP 메서드 설명
GET 이 메서드는 URI에서 데이터를 검색하는 데 사용되며 가장 많이 사용되는 HTTP 메서드일 수 있습니다.
HEAD 이 메서드는 실제로 요청 URI에서 데이터를 검색하지 않는다는 점을 제외하고 GET 메서드와 매우 유사합니다. HTTP 상태 검색하기만 하면 됩니다.
POST 이 메서드는 일반적으로 URI에 새 데이터를 보내는 데 사용됩니다. POST는 양식 데이터를 제출하는 데 자주 사용됩니다.
PUT 이 메서드는 일반적으로 원시 데이터를 URI로 보내는 데 사용됩니다. PUT은 Web API 애플리케이션에 JSON 또는 XML 데이터를 제출하는 데 자주 사용됩니다.
DELETE 이 메서드는 URI에서 데이터를 제거하는 데 사용됩니다.
OPTIONS 이 메서드는 일반적으로 URI에 대해 지원되는 HTTP 메서드 목록을 검색하는 데 사용됩니다.
이동 복사 이 두 메서드는 WebDAV와 함께 사용되며 해당 용도는 설명이 사용됩니다.
MKCOL 이 메서드는 WebDAV와 함께 사용되며 지정된 URI에서 컬렉션(예: 디렉터리)을 만드는 데 사용됩니다.
PROPFIND PROPPATCH 이러한 두 메서드는 WebDAV와 함께 사용되며 URI에 대한 속성을 쿼리하거나 설정하는 데 사용됩니다.
잠금 잠금 해제 이러한 두 메서드는 WebDAV와 함께 사용되며 작성 시 요청 URI로 식별되는 리소스를 잠그고 잠금 해제하는 데 사용됩니다.
PATCH 이 메서드는 기존 HTTP 리소스를 수정하는 데 사용됩니다.

이러한 HTTP 메서드 중 하나가 서버에서 사용하도록 구성된 경우 서버는 요청에 적합한 HTTP 상태 및 기타 데이터로 응답합니다. 예를 들어 GET 메서드는 HTTP 200 OK 응답을 받을 수 있으며 PUT 메서드는 HTTP 201 만든 응답을 받을 수 있습니다.

HTTP 메서드가 서버에서 사용하도록 구성되지 않은 경우 서버는 HTTP 501 구현되지 않음 오류로 응답합니다.

그러나 HTTP 메서드가 서버에서 사용하도록 구성되었지만 지정된 URI에 대해 사용하지 않도록 설정된 경우 서버는 HTTP 405 메서드 허용 안 함 오류로 응답합니다.

예제 HTTP 405 오류

다음 예제 HTTP 요청 및 응답은 HTTP 클라이언트가 웹 서버의 Web API 앱에 값을 PUT하려고 시도하고 서버가 PUT 메서드가 허용되지 않음을 나타내는 HTTP 오류를 반환하는 상황을 보여 줍니다.

HTTP 요청:

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

"Some Value"

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

이 예제에서 HTTP 클라이언트는 웹 서버의 Web API 애플리케이션에 대한 URL에 유효한 JSON 요청을 보냈지만 서버는 URL에 PUT 메서드가 허용되지 않음을 나타내는 HTTP 405 오류 메시지를 반환했습니다. 반면, 요청 URI가 Web API 애플리케이션의 경로와 일치하지 않으면 서버는 HTTP 404 찾을 수 없음 오류를 반환합니다.

HTTP 405 오류 해결

특정 HTTP 동사를 허용하지 않을 수 있는 몇 가지 이유가 있지만 IIS에서 이 오류의 주요 원인인 한 가지 주요 시나리오가 있습니다. 동일한 동사/메서드에 대해 여러 처리기가 정의되고 처리기 중 하나가 예상 처리기가 요청을 처리하지 못하도록 차단합니다. 설명을 통해 IIS는 경로 , 동사, 리소스 등의 첫 번째 일치 조합이 요청을 처리하는 데 사용되는 applicationHost.config및web.config 파일의 순서 처리기 항목을 기반으로 처음부터 끝까지 처리기를 처리합니다.

다음 예제는 PUT 메서드를 사용하여 Web API 애플리케이션에 데이터를 제출할 때 HTTP 405 오류를 반환한 IIS 서버의applicationHost.config파일에서 발췌한 것입니다. 이 발췌문에서 여러 HTTP 처리기가 정의되고 각 처리기에는 구성된 다른 HTTP 메서드 집합이 있습니다. 목록의 마지막 항목은 정적 콘텐츠 처리기이며, 이는 다른 처리기가 요청을 검사할 기회가 있는 후에 사용되는 기본 처리기입니다.

<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 처리기와 web API에 사용되는 ASP.NET 대한 확장 없는 URL 처리기는 별도의 HTTP 메서드 목록에 대해 명확하게 정의됩니다. 이 구성으로 인해 반드시 오류가 발생하지는 않지만 ISAPI DLL 처리기는 모든 HTTP 메서드에 대해 구성됩니다. 그러나 이와 같은 구성 설정은 HTTP 405 오류 문제를 해결할 때 고려해야 합니다.

앞의 예제에서 ISAPI DLL 처리기는 문제가 되지 않았습니다. 실제로 IIS 서버의 applicationHost.config 파일에 문제가 정의되지 않았습니다. 문제는 Visual Studio에서 Web API 애플리케이션을 만들 때 web.config 파일에서 만들어진 항목으로 인해 발생했습니다. 애플리케이션의 web.config 파일에서 발췌한 다음 내용은 문제의 위치를 보여 줍니다.

<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 메서드를 포함하도록 다시 정의됩니다. 그러나 WebDAV 처리기에 대해 유사한 HTTP 메서드 집합이 정의되므로 충돌이 발생합니다. 이 특정 경우 WebDAV 처리기는 Web API 애플리케이션을 포함하는 웹 사이트에 대해 WebDAV를 사용하지 않도록 설정되어 있더라도 IIS에 의해 정의되고 로드됩니다. HTTP PUT 요청을 처리하는 동안 IIS는 PUT 동사에 대해 정의되므로 WebDAV 모듈을 호출합니다. WebDAV 모듈이 호출되면 해당 구성을 확인하고 비활성화된 것으로 확인되므로 WebDAV 요청과 유사한 모든 요청에 대해 HTTP 405 메서드 허용 안 함 오류가 반환됩니다. 이 문제를 resolve 웹 API 애플리케이션이 정의된 웹 사이트의 HTTP 모듈 목록에서 WebDAV를 제거해야 합니다. 다음 예제에서는 다음과 같은 모양을 보여 있습니다.

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

이 시나리오는 애플리케이션이 개발 환경에서 IIS 프로덕션 환경으로 게시된 후에 종종 발생하며, 처리기/모듈 목록이 개발 환경과 프로덕션 환경 간에 다르기 때문에 발생합니다. 예를 들어 Visual Studio 2012 이상을 사용하여 Web API 애플리케이션을 개발하는 경우 IIS Express 테스트를 위한 기본 웹 서버입니다. 이 개발 웹 서버는 서버 제품에 제공되는 전체 IIS 기능의 축소된 버전이며, 이 개발 웹 서버에는 개발 시나리오에 대해 추가된 몇 가지 변경 내용이 포함되어 있습니다. 예를 들어 WebDAV 모듈은 사용되지 않을 수 있지만 IIS의 전체 버전을 실행하는 프로덕션 웹 서버에 설치되는 경우가 많습니다. IIS의 개발 버전(IIS Express)은 WebDAV 모듈을 설치하지만 WebDAV 모듈에 대한 항목은 의도적으로 주석 처리되므로 IIS Express 설치에 WebDAV 기능을 추가하기 위해 IIS Express 구성 설정을 특별히 변경하지 않는 한 WebDAV 모듈은 IIS Express 로드되지 않습니다. 따라서 웹 애플리케이션이 개발 컴퓨터에서 올바르게 작동할 수 있지만 프로덕션 IIS 웹 서버에 Web API 애플리케이션을 게시할 때 HTTP 405 오류가 발생할 수 있습니다.

HTTP 501 오류

  • 서버에서 특정 기능이 구현되지 않음을 나타냅니다.
  • 일반적으로 HTTP 요청과 일치하는 IIS 설정에 정의된 처리기가 없음을 의미합니다.
    • IIS 또는 에 문제가 올바르게 설치되지 않음을 나타내는 것일 수 있습니다.
    • 특정 HTTP 메서드를 지원하는 처리기가 정의되지 않도록 IIS 설정을 수정했습니다.

이 문제를 resolve 위해 해당 모듈 또는 처리기 정의가 없는 HTTP 메서드를 사용하려는 애플리케이션을 다시 설치해야 합니다.

요약

HTTP 405 오류는 요청된 URL에 대해 웹 서버에서 HTTP 메서드를 허용하지 않을 때 발생합니다. 이 조건은 특정 동사에 대해 특정 처리기가 정의되고 해당 처리기가 요청을 처리할 것으로 예상되는 처리기를 재정의하는 경우에 종종 표시됩니다.