Asp.NET Web API-405-이 페이지에 액세스하는 데 사용되는 HTTP 동사가 허용되지 않음-처리기 매핑 설정 방법
ASP.NET Web API를 사용하여 REST 서비스를 작성했습니다. HttpDelete 요청을 보내려고하는데 다음과 같은 오류가 발생합니다.
405-이 페이지에 액세스하는 데 사용되는 HTTP 동사가 허용되지 않습니다.
나는 해결책에 가깝다고 생각하고 IIS 원격 관리를 활성화하고 Handler Mappings 섹션으로 이동하여 적절한 위치에 DELETE 동사를 추가해야한다는 것을 알았지 만 문제는 많은 다른 위치가 있다는 것입니다. 목록 ... (여기와 같은 : http://www.somacon.com/p126.php ).
어느 것을 편집해야합니까? 그들 중 일부는 "ExtensionUrlHandler-Integrated-4.0"과 같은 확장자가 없으며 여기에 DELETE 동사를 추가했지만 여전히 작동하지 않습니다.
그 사진을 수정하는 것은 어둠 속에서 촬영 한 것뿐입니다. 다른 위치를 수정해야합니까? 그렇다면 어느 것입니까? 아니면 내가해야 할 일이 더 있습니까?
동일한 웹 서비스가 내 로컬 서비스에서 완벽하게 작동하므로 문제가 원격 IIS에 있다고 생각합니다.
인사말
이 오류의 일반적인 원인은 WebDAV 입니다. 제거했는지 확인하십시오.
WebDAV를 제거 할 필요가 없습니다. web.config에 다음 줄을 추가하기 만하면됩니다.
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
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>
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>
위의 솔루션 중 어느 것도 내 경우와 같이 문제를 해결하지 못하면 (여전히 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)를 반환합니다.
드물지만 일부 도움이 될 수 있습니다.
System.Web.Http의 [HttpPut] 을 사용하고 있는지 확인하십시오.
우리는 HttpPut 데코 레이 티드 메서드에서 '허용되지 않는 메서드'405를 얻었습니다.
실수로 System.Web.Http가 아닌 System.Web.Mvc 의 [HttpPut] 특성을 사용했기 때문에 문제가 드물게 보입니다.
그 이유는 resharper가 .Mvc 버전을 제안했는데, 일반적으로 ApiController 에서 직접 파생 될 때 이미 System.Web.Http가 참조 되어 ApiController를 확장 한 클래스를 사용했습니다.
이 문제가 있었고 다음을 해결했습니다.
- 핸들러 매핑 창에서 WebDAV 찾기
- 모듈 매핑 편집에서 요청 제한을 엽니 다.
내가 호출 한 웹 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)
이 오류는 정적 파일 처리기에서 발생합니다. 기본적으로 동사를 필터링하지 않지만 HEAD 및 GET 만 처리 할 수 있습니다.
And this is because no other handler stepped up to the plate and said they could handle DELETE.
Since you are using the WEBAPI, which because of routing doesn't have files and therefore extensions, the following additions need to be added to your web.config file:
<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" />
Obviously what is needed depends on classicmode vs integratedmode, and classicmode depends on bitness. In addition, the OPTIONS header has been added for CORS processing, but if you don't do CORS you don't need that.
FYI, your web.config is the local to the application (or application directory) version whose top level is applicationHost.config.
If it is IIS 8.0 check if HTTP Activation is enabled. Server manager -> IIS -> Manage (see right top) -> Add Roles and Features -> ... -> get to WCF configuration and then select HTTP Activation.
In our case, the problem was with federated signon between a .Net site and ADFS. When redirecting to the ADFS endpoint the wctx
parameter needed all three parameters for the WSFederationAuthenticationModule.CreateSignInRequest
method: rm
, id
, and ru
Thanks to Guillaume Raymond for the tip to check the URL parameters!
Besides all above solutions, check if you have the "id
" or any custom defined parameter in the DELETE
method is matching the route config.
public void Delete(int id)
{
//some code here
}
If you hit with repeated 405 errors better reset the method signature to default as above and try.
The route config by default will look for id
in the URL. So the parameter name id
is important here unless you change the route config under the App_Start
folder.
You may change the data type of the id
though.
For example the method below should work just fine:
public void Delete(string id)
{
//some code here
}
Note: Also ensure that you pass the data over the url not the data method that will carry the payload as body content.
DELETE http://{url}/{action}/{id}
Example:
DELETE http://localhost/item/1
Hope it helps.
을 PHP
( Laravel
를) 사용 하여 실행하려는 경우 ( 어쩌면) 또는 다른 고유 한 IIS
호스팅 상황 에 멈춰있는 사람들을 위해 해당 특정 상황에 대한 처리기에서 405 error
를 변경해야 합니다. 핸들러와의 다음 탭에서 추가 당신이 필요합니다. 이것은에 추가하는 데 필요한 모든 I이었다 가능하도록 에서 .verbs
PHP
PHP
Request Restrictions
Verbs
verbs
web.config
CORS
Laravel
<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>
'Programming' 카테고리의 다른 글
포드 설치 오류 (0) | 2020.08.25 |
---|---|
이 1988 C 코드의 문제점은 무엇입니까? (0) | 2020.08.25 |
소수점 이하 숫자를 얻는 방법? (0) | 2020.08.25 |
Red Hat Linux에서 표준 도구를 사용하여 파일의 행을 무작위 화하려면 어떻게해야합니까? (0) | 2020.08.25 |
Android TextView에서 HTML 목록 태그가 작동하지 않습니다. (0) | 2020.08.25 |