Asp.NET Web API-405-이 페이지에 액세스하는 데 사용되는 HTTP 동사가 허용되지 않음-처리기 매핑 설정 방법


106

ASP.NET Web API를 사용하여 REST 서비스를 작성했습니다. HttpDelete 요청을 보내려고하는데 다음과 같은 오류가 발생합니다.

405-이 페이지에 액세스하는 데 사용되는 HTTP 동사가 허용되지 않습니다.

나는 해결책에 가깝다고 생각하고 IIS 원격 관리를 활성화하고 Handler Mappings 섹션으로 이동하여 적절한 위치에 DELETE 동사를 추가해야한다는 것을 알았지 만 문제는 많은 다른 위치가 있다는 것입니다. 목록 ... (여기와 같은 : http://www.somacon.com/p126.php ).

어느 것을 편집해야합니까? 그들 중 일부는 "ExtensionUrlHandler-Integrated-4.0"과 같은 확장자가 없으며 여기에 DELETE 동사를 추가했지만 여전히 작동하지 않습니다.

그 사진을 수정하는 것은 어둠 속에서 촬영 한 것뿐입니다. 다른 위치를 수정해야합니까? 그렇다면 어느 것입니까? 아니면 내가해야 할 일이 더 있습니까?

동일한 웹 서비스가 내 로컬 서비스에서 완벽하게 작동하므로 문제가 원격 IIS에 있다고 생각합니다.

인사말


3
안녕 바트. web.config에 대한 답변을 변경할 수 있습니까? 제거하는 것보다 정말 좋습니다. 당신은 시청자의 많은이
Ashkan Sirous

답변:


28

이 오류의 일반적인 원인은 WebDAV 입니다. 제거했는지 확인하십시오.


나는 그것을 해제했지만, 그것은 도움이되지 않았다
바트

3
비활성화는 도움이되지 않으므로 제거해야합니다.
John_

사용 중지해도 도움이되지 않음을 확인할 수 있습니다. @John_이 맞습니다. 제거해야합니다.
Mike L

7
아래 giacomelli의 답변은이 질문에 대해 올바른 것으로 표시되어야합니다. WebDav를 제거 할 필요가없는 로컬 솔루션입니다.
Joseph Woodward

1
@ B.ClayShannon WebDAV는 독립 실행 형 프로그램이 아니라 IIS 기능입니다. 따라서 OS에 따라 Windows 기능 / 역할 / 역할 서비스 / ... 분류를 위해 발명하는 것이 좋다고 생각하는 다른 항목에서 찾아야합니다. 그러나 web.config의 변경 사항이 차이가 없다면 어쨌든 다른 문제가 발생했음을 의미합니다.
Frédéric

359

WebDAV를 제거 할 필요가 없습니다. web.config에 다음 줄을 추가하기 만하면됩니다.

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>

1
이것은 잘 작동했습니다. 모든 것을 사용해야합니다. "remove name = ..."줄을 모두 포함합니다.
Chris Patterson

51
이것은 글로벌 솔루션이 아닌 로컬 솔루션이므로 허용되는 대답 imho 여야합니다.
Marco Mp

3
이것은 내일 아침에 큰 데모를보기 전에 저를 위해 나왔습니다. 당신은 문학적으로 내 생명을 구했습니다.
Sonic Soul

27
"당신은 말 그대로 내 생명을 구했습니다"-갑자기 내 고객이 그렇게 나쁘게 보이지 않습니다.
브랜든 GANO

3
훌륭한 대답입니다. 나는 이것이 받아 들여진 대답이어야한다는 데 동의합니다. 이로 인해 웹 서버에서 WebDAV를 완전히 제거하는 것보다 훨씬 기분이 좋아졌습니다.
mituw16

17

Web.Config 파일을 아래와 같이 변경하십시오.

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

WebDAV 및 WebDAVMODULE 제거를 추가하면 PUT 및 DELETE 기능이 허용됩니다. 감사.
Gfw

난 내 API 프로젝트 webconfig 파일에 위의 코드를 추가 할 때 hellped
Baqer Naqvi을

15

Web.Config 파일을 아래와 같이 변경합니다. 매력처럼 행동합니다.

노드 <system.webServer>에서 코드 부분 아래 추가

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

추가 후 Web.Config는 다음과 같습니다.

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <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" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

Allow-Origin에 대해 *를 반환해서는 안됩니다. stackoverflow.com/a/12014554
Karlas를

@Karlas, 의견을 남기고 투표하기 전에 먼저 질문을 읽으십시오. 질문은 "Allow-Origin"에 대한 질문이 아니라 http 동사에 대한 처리기를 요청했습니다.
Santosh Prasad Sah

3
누군가가 솔루션을 복사하여 붙여 넣을 경우를 대비하여 나는 반대표를 던지지 않았습니다.
Karlas

감사! runAllManagedModulesForAllRequests = "true"가 나를 위해 한 일입니다.
Eddie Fletcher

9

이 문제가 있었고 다음을 해결했습니다.

  1. IIS 열기
  2. 백엔드 사이트 선택

    여기에 이미지 설명 입력

  3. 기능보기에서 : 핸들러 매핑 열기

여기에 이미지 설명 입력

  1. 핸들러 매핑 창에서 WebDAV 찾기

여기에 이미지 설명 입력

  1. 모듈 매핑 편집에서 요청 제한을 엽니 다.

여기에 이미지 설명 입력

  1. 여기에 이미지 설명 입력

내 생명을 구했습니다. 감사합니다
deanwilliammills

1
이것은 작동하지 않았습니다. 그것은 전체 .Net CORE 사이트를 망가 뜨 렸습니다. 되돌려 야했다.
Ravi Ram

4

위의 솔루션 중 어느 것도 내 경우와 같이 문제를 해결하지 못하면 (여전히 RestClient 모듈이 405를 향하고 있음) Postman 또는 Fiddler와 같은 도구로 Api를 요청하십시오. 문제가 잘못된 형식의 요청과 같은 다른 곳에있을 수 있음을 의미합니다.

내 RestClient 모듈이 형식이 잘못된 Id 매개 변수로 'Put'을 요청하고 있음을 발견했습니다.

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

대신에

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

놀랍게도 잘못된 형식의 요청은 405-Method Not Allowed (IIS 7.5)를 반환합니다.


여기에도 같은 상황이 있습니다. 하지만 제 경우에는 PUT 요청으로 본문을 전달해야합니다. Insomnia (Postman과 같은)를 도구 클라이언트로 사용하고 있으며 매우 잘 작동합니다. 하지만 내 코드에는 없습니다. 어떤 아이디어?
Darós

3

드물지만 일부 도움이 될 수 있습니다.

System.Web.Http의 [HttpPut] 을 사용하고 있는지 확인하십시오.

우리는 HttpPut 데코 레이 티드 메서드에서 '허용되지 않는 메서드'405를 얻었습니다.

실수로 System.Web.Http가 아닌 System.Web.Mvc 의 [HttpPut] 특성을 사용했기 때문에 문제가 드물게 보입니다.

그 이유는 resharper가 .Mvc 버전을 제안했기 때문입니다. 일반적으로 System.Web.Http는 ApiController 에서 직접 파생 될 때 이미 참조 되어 ApiController를 확장 한 클래스를 사용했습니다.


1
Web API를 사용하는 경우 컨트롤러 메서드를 전혀 장식하지 않고 메서드 이름에 동사를 사용합니다.
niico

2

내가 호출 한 웹 API 게시 메서드에 본문에서 액세스 한 복잡한 형식 대신 매개 변수에 대한 기본 형식이있을 때 이런 일이 발생했습니다 (405 메서드는 허용되지 않음). 이렇게 :

이것은 작동했습니다.

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

이것은하지 않았다 :

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)

1
이는 경로의 매개 변수와 메소드 서명의 변수 이름이 일치하지 않는 경우에도 발생할 수 있습니다 (즉, route = "/ api / person / {identity}"및 method = "public void putPerson (int id)). {...} ")
RonnBlack 2015

2

이 오류는 정적 파일 처리기에서 발생합니다. 기본적으로 동사를 필터링하지 않지만 HEAD 및 GET 만 처리 할 수 ​​있습니다.

그리고 이것은 다른 핸들러가 판에 올라서 DELETE를 처리 할 수 ​​있다고 말하지 않았기 때문입니다.

라우팅으로 인해 파일 및 확장명이없는 WEBAPI를 사용하고 있으므로 web.config 파일에 다음 추가 사항을 추가해야합니다.

<system.webserver>
    <httpProtocol>
        <handlers>
          ...
            <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
            <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

            <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
            <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

분명히 필요한 것은 클래식 모드 대 통합 모드에 따라 다르며 클래식 모드는 비트에 따라 다릅니다. 또한 CORS 처리를 위해 OPTIONS 헤더가 추가되었지만 CORS를 수행하지 않으면 필요하지 않습니다.

참고로 web.config는 최상위 수준이 applicationHost.config 인 응용 프로그램 (또는 응용 프로그램 디렉터리) 버전의 로컬입니다.


1

IIS 8.0 인 경우 HTTP 활성화가 활성화되어 있는지 확인하십시오. 서버 관리자-> IIS-> 관리 (오른쪽 상단 참조)-> 역할 및 기능 추가-> ...-> WCF 구성으로 이동 한 다음 HTTP 활성화를 선택합니다.


0

우리의 경우 문제는 .Net 사이트와 ADFS 간의 연합 사인온에있었습니다. ADFS 끝점으로 리디렉션 할 때 wctx매개 변수에는 WSFederationAuthenticationModule.CreateSignInRequest메서드에 대한 세 가지 매개 변수 rmid, 및ru

URL 매개 변수를 확인하는 팁을 주신 Guillaume Raymond에게 감사드립니다!


0

위의 모든 솔루션 외에도 방법에 " id"또는 사용자 정의 매개 변수 DELETE가 경로 구성과 일치 하는지 확인하십시오 .

public void Delete(int id)
{
    //some code here
}

반복되는 405 오류가 발생하면 위와 같이 메소드 서명을 기본값으로 재설정하고 시도하십시오.

기본적으로 경로 구성 id은 URL에서 찾습니다 . 따라서 폴더 id아래의 경로 구성을 변경하지 않는 한 여기서 매개 변수 이름 이 중요 App_Start합니다.

id그래도 데이터 유형을 변경할 수 있습니다 .

예를 들어 아래 방법은 잘 작동합니다.

public void Delete(string id)
{
    //some code here
}

참고 : 또한 페이로드를 본문 콘텐츠로 전달할 데이터 메서드가 아닌 URL을 통해 데이터를 전달해야합니다 .

DELETE http://{url}/{action}/{id}

예:

DELETE http://localhost/item/1

도움이되기를 바랍니다.


0

PHP( Laravel를) 사용 하여 실행하려고 시도 하거나 (경우에 따라) 다른 고유 한 IIS호스팅 상황 에 멈춰있는 사람들을 위해 해당 특정 상황에 대한 처리기에서 405 error를 변경해야한다고 추가 할 것입니다. 핸들러와의 다음 탭에서 추가 당신이 필요합니다. 이것은에 추가하는 데 필요한 모든 I이었다 가능하도록 에서 .verbsPHPPHPRequest RestrictionsVerbsverbsweb.configCORSLaravel

<handlers>
  <remove name="php-5.6.40" />
  <add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>

0

위의 어느 것도 나를 위해 일하지 않았고 지원 페이지 ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website)를 사용하여 문제를 해결했습니다. 그런 다음 응용 프로그램 호스트 파일을 작업 복사본 중 하나와 비교했는데 많은 처리기가 누락 된 것처럼 보이며 응용 프로그램 호스트에 다시 추가했을 때 작동이 시작되었습니다. 나는이 모든 것을 놓치고 있었다.

<add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.