programing

Asp.NET Web API - 405 - 이 페이지에 액세스하는 데 사용되는 HTTP 동사는 허용되지 않습니다 - 핸들러 매핑 설정 방법

showcode 2023. 4. 20. 23:25
반응형

Asp.NET Web API - 405 - 이 페이지에 액세스하는 데 사용되는 HTTP 동사는 허용되지 않습니다 - 핸들러 매핑 설정 방법

ASP를 사용하여 REST 서비스를 작성했습니다.NET Web APIHttpDelete 요청을 전송하려고 하는데 다음 오류가 나타납니다.

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

솔루션에 가까워진 것 같습니다.IIS 리모트 관리를 유효하게 하고 [Handler Mappings]섹션으로 이동하여 적절한 위치에 DELETE 동사를 추가합니다.하지만 문제는 리스트에 많은 다른 포지션이 있다는 것이다.(http://www.somacon.com/p126.php)과 같은 사이트입니다.

어떤 걸 편집할까요?extensionUrlHandler-Integrated-4.0과 같이 확장자가 없는 것은 거의 없고, DELETE 동사를 추가했지만 아직 동작하지 않습니다.

그걸 수정하는 건 그냥 암암리에 찍은 건데, 다른 위치를 수정하는 게 좋을까요?만약 그렇다면, 어느 쪽입니까?아니면 제가 해야 할 일이 더 있을까요?

로컬 서비스에서도 같은 웹 서비스가 완벽하게 작동하기 때문에 리모트 IIS에 문제가 있는 것 같습니다.

인사말

WebDAV 를 언인스톨 할 필요는 없습니다.web.config 에 다음의 행을 추가합니다.

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

이 에러의 일반적인 원인은 WebDAV입니다.반드시 언인스톨 해 주세요.

웹을 변경하세요.다음과 같은 구성 파일

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

웹을 변경하세요.설정 파일은 다음과 같습니다.그것은 매력적으로 작용할 것이다.

" " " 입니다.<system.webServer>

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

추가한 후에는 웹입니다.구성은 다음과 같습니다.

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

이 문제가 발생하여 다음 사항을 해결했습니다.

  1. 오픈 IIS
  2. 백엔드 사이트 선택

    여기에 이미지 설명 입력

  3. 기능 뷰: 핸들러 매핑 열기

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

  1. Edit Module Mapping에서 Request Restrictions

여기에 이미지 설명 입력

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

해 주세요.web.confiqfilename" (파일명)

<modules>        
        <remove name="WebDAVModule" />    
    </modules> 
      <handlers>
                <remove name="WebDAV" />
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>

위의 솔루션 중 내 경우와 같은 문제를 해결하지 못한 경우(내 RestClient 모듈이 405를 향하고 있는 경우) Postman이나 Fiddler와 같은 도구를 사용하여 API를 요청해 보십시오.잘못된 형식의 요청과 같은 다른 곳에 문제가 있을 수 있습니다.

RestClient 모듈이 Id paramemeter의 형식이 올바르지 않은 '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)를 반환합니다.

흔하지는 않지만 도움이 될 수도 있습니다.

시스템의 [HttpPut]를 사용하고 있는지 확인합니다.Web.Http

우리는 HttpPut 장식된 메서드에서 'Method not allowed' 405를 받았습니다.

실수로 System의 [HttpPut]속성을 사용했기 때문에 이 문제는 드물 것 같습니다.Web.Mvc, 시스템 없음.Web.Http

그 이유로 resharper는 를 제안했습니다.MVC 버전, 보통 System과 같이.Web.Http는 이미 ApiController에서 직접 파생되었을 때 참조되고 있습니다.이 클래스는 확장 APIController를 사용하고 있었습니다.

호출한 web api post method가 본문에서 접근한 복잡한 타입이 아닌 파라미터의 원시 타입을 가지고 있을 때(405 method는 허용되지 않습니다).다음과 같은 경우:

이것은 효과가 있었다:

 [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만 처리할 수 있습니다.

그 이유는 다른 핸들러가 나서서 DELETE를 처리할 수 있다고 하지 않았기 때문입니다.

WEBAPI 를 사용하고 있습니다.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가 최상위 수준인 응용 프로그램(또는 응용 프로그램 디렉토리) 버전의 로컬입니다.

IIS 8.0 의 경우는, HTTP 액티베이션이 유효하게 되어 있는지를 확인합니다.서버 매니저 -> IIS -> 관리(오른쪽 위 참조) -> 역할 및 기능 추가 -> ...> WCF 설정으로 이동하여 [HTTP Activation]를 선택합니다.

위의 어느 것도 기능하지 않고, 서포트 페이지(https://support.microsoft)를 사용해 촬영할 수 없었습니다.com/en-us/help/942051/error-message-when-a-user-sublic-hosted-that-hosted-on-a-server)를 사용하여 어플리케이션호스트 파일과 작업 복사본 중 하나를 비교했습니다.핸들러 묶음이 없는 것 같아서 어플리케이션호스트에 다시 추가했을 때 동작합니다.난 이 모든 걸 놓치고 있었어

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

이 예에서는 사이의 페더레이션사인온에 문제가 있었습니다.ADFS 。 하는 경우, ADFS 는 「」를 해 주세요.wctx에는 3개의 가 모두 했습니다.WSFederationAuthenticationModule.CreateSignInRequest ★★★★rm,id , , , , 입니다.ru

URL 파라미터를 체크하기 위한 힌트를 주신 기욤 레이먼드 씨께 감사드립니다!

외에이 "이러다"가 .id 중 를 지정합니다.DELETE메서드는 루트 설정과 일치합니다.

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

405 에러가 반복되었을 경우는, 메서드의 시그니처를 상기와 같이 디폴트로 리셋 해 주세요.

에서는, 「」가 됩니다.id이 파라미터의 이름은 다음과 같습니다.id은 "Route Configuration"에서 설정을 한입니다.App_Start더입니니다다

할 수 있습니다.id★★★★★★★★★★★★★★★★★★.

예를 들어, 다음의 방법은 정상적으로 동작합니다.

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

주의: 또한 페이로드가 본문 콘텐츠로 전송되는 데이터 방식이 아닌 URL을 통해 데이터를 전달해야 합니다.

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

예:

DELETE http://localhost/item/1

도움이 됐으면 좋겠다.

PHP )Laravel case) unique 5 ( 5 ) 。IIS의 「」를 사용한 호스트 상황.405 error, 바꿀 필요가 있다, 이야기합니다.verbs★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★PHP는 오늘 에 갔습니다.PHP와 「」로 설정합니다.Request Restrictions , , , 「 」Verbs " " 를 합니다.verbs 됩니다.web.config하게 하다CORSLaravel.

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

이는 순수 "Web API"에는 적용되지 않을 수 있습니다.일반적인 공개 사이트에는 적용되지 않을 수 있습니다만, IIS 10이 설치된 웹사이트에서 405 "Method Not Allowed issue"라는 오류가 발생한 경우, AspNetCore 2.2, MVC 2 (또는 3) 및 Angular 9를 사용하여 빌드된 어플리케이션에서 발생한 경우, 이것이 저의 경험입니다.오류 메시지는 MVC 컨트롤러에 연결할 수 있지만 MVC 컨트롤러의 Http 동사 옵션 중 하나로 "PUT"이 허용되지 않았거나 검색 또는 나열되지 않았음을 나타냅니다.

POST로 로그인 할 수 있었습니다('Login()'은 [HttpPost(route)]로 장식된 MVC 컨트롤러 메서드의 이름이었기 때문에) GET 동사를 정상적으로 사용할 수 있었습니다.네비게이션에는 루트를 사용합니다.

그러나 POST를 사용하여 새 엔트리를 만들거나 PUT을 사용하여 편집하거나 DELETE를 사용하여 삭제할 수 없었습니다."405" 오류를 받았습니다.

제 경우 Web.config에서 WebDAV 참조를 삭제하면 "405"에서 "400 - Bad Request"로 발생한 오류만 변경됩니다.

그러나 이 정보도 도움이 되었기 때문에 개발 모드로 돌아가 HTTP Verb 이름에 맞게 MVC 컨트롤러 메서드 이름을 변경했습니다. 예를 들어 "PUT"은 컨트롤러 메서드 "Put()"에 일치합니다. [FromBody]를 사용해도 마찬가지입니다."DELETE" 동사는 "Delete()" 메서드 이름과 일치하며 POST는 "Post()"와 일치합니다.새로운 메서드 이름에서 "id" 등 필요한 파라미터를 삭제하거나 변경하지 않았습니다.

테스트를 다시 시작했는데, dotnet 서버 컴파일에서 MVC 컨트롤러 경로에서 사이트위조 방지 문제가 있음을 나타내는 오류가 발생했습니다.

저는 StartUp.cs에서도 위조방지 헤더/브라우저를 사용하고 있으며, 로그인 POST에서도 동작하고 있기 때문에 StartUp.cs에서는 아무것도 변경하지 않았습니다.

그러나 MVC 컨트롤러 클래스는 [AutoValidateAntiforgy]로 꾸며졌습니다.Token] 속성(사용 이유를 완전히 이해하지 못하고 예에 따라 했을 뿐) 및 MVC 컨트롤러 메서드는 [HttpPut] 등으로 꾸며졌습니다.

그래서 dotnet 컴파일 오류로 인해 클래스 레벨 속성 [AutoValidateAntiforgy]를 삭제했습니다.토큰] 단, 각 MVC 컨트롤러의 메서드레벨에서 [HttpPut]아트리뷰트 등은 그대로입니다.

이것이 저의 솔루션이었습니다.web.config를 편집하여 WebDAV를 삭제하고 컨트롤러 메서드 이름을 http 동사와 일치시키고 [AutoValidateAntiforgy]를 삭제했습니다.MVC 컨트롤러 클래스의 토큰] 속성 - 내 웹 사이트가 공개가 아닌 개인 사이트이기 때문입니다.

로그인 헤더의 x-xsrf-displays / cookie / 위조방지 기능이 StartUp.cs에 남아 있어 로그인 시에도 정상적으로 동작합니다.다만, MVC 컨트롤러 클래스의 레벨로 동작시키는 방법을 조사 중입니다.

하지만 지금은 POST, PUT, DELETE는 오류 없이 할 수 있습니다.

업데이트 - **400 - Bad Request 문제에 대한 다른 게시물을 읽었더니 "ASP"에 대한 링크를 찾았습니다.NET Core Web API 위조 방지"를 참조하십시오.많은 도움이 되었습니다.MVC AntiForgyController 및 Angular Injectionable 서비스 추가 등 기사에서 제안한 업데이트를 수행한 후 "Validate"를 사용하여 컨트롤러에 대해 CRSF를 켜고 PUT, POST 및 DELETE를 실행할 수 있습니다.위조 방지대부분의 컨트롤러에서 토큰"을 사용하지만 기사에서 설명한 것처럼 일부 메서드는 무시합니다().

기사의 변경 내용 외에 StartUp.cs에서 Configure() 메서드로 이 앱을 등록했습니다.공용 루트는 "facebook" 이외에는 없습니다.

        app.Use(nextDelegate => context =>
        {
            string path = context.Request.Path.Value;
            string[] directUrls = { "/<first restricted url route>", "/<second restricted url route>", "/<third>" };
            if (path.StartsWith("/api") || string.Equals("/", path) ||
                directUrls.Any(url => path.StartsWith(url)))
            {
                var tokens = antiforgery.GetAndStoreTokens(context);
                context.Response.Cookies.Append("XSRF-REQUEST-TOKEN", tokens.RequestToken,
                    new CookieOptions()
                    {
                        HttpOnly = false,
                        Secure = false,
                        IsEssential = true
                    });
            }
            return nextDelegate(context);
        });

언급URL : https://stackoverflow.com/questions/9854602/asp-net-web-api-405-http-verb-used-to-access-this-page-is-not-allowed-how

반응형