code

ASP.NET 웹 API - PUT & DELETE 동사 허용 안 됨 - IIS 8

starcafe 2023. 5. 3. 21:37
반응형

ASP.NET 웹 API - PUT & DELETE 동사 허용 안 됨 - IIS 8

최근 Visual Studio 2010에서 Visual Studio 2012 RC로 업그레이드했습니다.설치 관리자는 Visual Studio에서 현재 기본 웹 서버로 사용하는 IIS 8 Express도 설치합니다.

IIS 8에서 PUT 및 DELETE 동사를 사용하는 WEB API 요청을 차단합니다. 오류, IIS에서 405 오류를 합니다.The requested resource does not support http method 'PUT'.

나는 사람들이 과거에 이것에 대해 문제를 가지고 있다는 것을 알고 있고 스택 오버플로에 그것에 대한 몇 가지 메시지가 있습니다.IIS 7 Express의 솔루션은 WebDav를 제거하는 것이었습니다.안타깝게도 IIS 8을 사용할 수 있는 방법을 찾을 수 없습니다.

애플리케이션 host.config에서 WebDav 섹션을 편집하려고 했지만 도움이 되지 않았습니다.를 들어, 저는 예를들제습다니했거어다를 했습니다.<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />구성 파일에서.

저는 이것에 너무 오랜 시간을 소비했습니다.PUT 및 DELETE를 활성화하는 간단한 방법이 있어야 합니까?

좋아요, 드디어 진상을 알아냈어요.PUT 및 DELETE 동사가 IIS8에서 올바르게 작동하려면 몇 가지 후프를 건너뛰어야 합니다.실제로 VS 2012의 릴리스 후보를 설치하고 새 WEB API 프로젝트를 생성하면 샘플 PUT 및 DELETE 메서드에서 404개의 오류가 즉시 반환됩니다.

웹 API에서 PUT 및 DELETE 동사를 사용하려면 %userprofile%\documents\iispress\config\applicationhost.config를 편집하고 다음과 같이 Extensionl Url 처리기에 동사를 추가해야 합니다.

이 줄 변경:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

대상:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

위의 내용 외에도 WebDAV가 사용자의 요청을 방해하지 않는지 확인해야 합니다.이 작업은 applicationhost.config에서 다음 행을 주석 처리하여 수행할 수 있습니다.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" /> 
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

또한 메서드 이름은 호출된 HTTP 동사와 같아야 한다는 것이 기본 웹 API 규칙입니다.예를 들어 HTTP 삭제 요청을 보내는 경우 기본적으로 메서드의 이름은 삭제입니다.

웹을 변경합니다.아래와 같이 파일을 구성합니다.그것은 매력적으로 행동할 것입니다.

드내에서<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>

WebDAV 제거는 내 경우에 완벽하게 작동합니다.

<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.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>

앱이 다른 시스템에서 호스팅되는 경우 발생하지 않도록 하려면 iis 또는 machine.config를 통해 문제를 해결하는 대신 web.config를 통해 문제를 해결하는 것이 항상 더 낫습니다.

web.config를 업데이트합니다.

  <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <add name="ExtensionlessUrl-Integrated-4.0"
           path="*."
           verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

호스트 구성을 수정할 필요가 없습니다.

Asp.Net Web API - webconfig에 있습니다.이것은 모든 브라우저에서 작동합니다.

시스템 내부에 다음 코드를 추가합니다.웹 태그

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

시스템을 교체합니다.아래 코드를 가진 웹 서버 태그

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>

<validation validateIntegratedModeConfiguration="false" />
<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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

</handlers>

CORS 활성화(깔끔하고 깔끔함)

1.CORS 너겟 패키지 추가

Install-Package microsoft.aspnet.webapi.cors

2.in 등록 방법에 WebApiConfig.cs 파일을 추가합니다. 아래 코드:

config.EnableCors();

ex:
시스템을 사용합니다.nbc.Http;

namespace test
{
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services


        config.EnableCors(); //add this**************************


        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );           
    }
}
}

3. get, post, delete, put 또는 임의의 http 메서드를 포함하여 컨트롤러의 네임스페이스에 다음 코드를 추가합니다.

[EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")]

ex:

using System.Web.Http.Cors;//add this******************************
namespace Test.Controllers
{
[EnableCors(origins: "http://localhost:53681/HTML/Restaurant.html", headers: "*", methods: "*")]
public class RestaurantController : ApiController
{
    protected TestBusinessLayer DevTestBLL = new TestBusinessLayer();

    public List<Restaurant> GET()
    {
        return DevTestBLL.GetRestaurant();
    }

    public List<Restaurant> DELETE(int id)
    {
        return DevTestBLL.DeleteRestaurant(id);
    }       
}
}

참조 : http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

이것은 다른 답변들과 함께 iis8에서 저에게 효과가 있었습니다.제 실수는 특히 404.6점이었습니다.

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>

이 문제가 발생할 수 있는 다른 사용자를 위한 빠른 업데이트입니다.오늘 현재 %userprofile%\documents\iispress\config\applicationhost.config를 변경해도 더 이상 작동하지 않습니다(Windows 업데이트로 인해 지금까지 정상적으로 작동했습니다).몇 시간 동안의 좌절 끝에 web.config를 변경하여 이러한 핸들러를 시스템에 추가했습니다.웹 서버가 작동합니다.

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

PHP의 경우 단순하게 다음과 같습니다.

  1. IIS 열기
  2. 처리기 매핑으로 이동
  3. php5.6.x 또는 php7.0.x에서 편집을 클릭합니다.
  4. "제한 요청"을 클릭
  5. 동사 탭에서 "다음 동사 중 하나"를 선택하고 "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS"를 추가합니다.

저는 이것이 다른 핸들러들과도 잘 작동할 것이라고 생각합니다.

아무것도 작동하지 않은 후, 저는 다음 단계로 이 문제를 해결할 수 있었습니다.

IIS 설치 중 'WEB DAV PUBLISING' IIS 설정을 선택하지 않았습니다. • INETMGR - 기본 웹사이트 – 요청 필터링 – HTTP 동사 – PUT as True

이미 제공된 답변(PUT, DELETE 동사 추가 및 WEBdav 제거)을 끝없는 검색과 시도 끝에 작동하지 않았습니다.

IIS logging settings : > View Log Files로 이동하였습니다.제 경우 W3SVC4는 최신 날짜의 폴더였습니다. 폴더를 열고 최신 로그 파일을 찾아 다음 항목을 확인했습니다. GET/Rejected-By-UrlScan ~/MYDOMAIN/API/ApiName/UpdateMODE

업데이트 방법이 GET 동사와 함께 나열되어 있었습니다. 이상하죠?그래서 저는 Rejected-By-UrlScan을 검색했고 UrlScan Breaked My Blog 링크를 찾았습니다.

여기로 이동했습니다. %windir%\system32\inetsrv\urlscan\UrlScan.ini

기본적으로 UrlScan은 PUT 및 DELETE 동사를 차단했습니다.저는 이 INI 파일을 열고, PUT과 DELETE를 AllowVerbs에 추가하고 DenyVerbs 목록에서 제거했습니다.INI 파일을 저장했는데 작동했습니다!따라서 이러한 단계는 ExtensionlessUrlHandler 힌트 다음에 필요했습니다.

윈도우즈 웹 서버 2008 R2(64비트), IIS 7.5.저는 이것을 DotNetNuke(DNN) WebAPI와 함께 사용하고 있습니다.ASP.Net 4.0 내 업데이트 방법:

[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)

저는 당신과 같은 문제를 마주하고 해결했습니다. 여기 해결책이 있습니다. 도움이 되었으면 합니다.

IIS 서modules구성, 웹 DAV 모듈을 루프업합니다. 웹 서버에 있는 경우 해당 모듈을 제거합니다.

번째

IIS 서handler mappings핸들러의 을 볼 수 , 당신은 선할수 핸들목 록수구 있성는을 할 수 있습니다.the PHP item 요청한 후, 편페이에서제요청버클다릭선음다택니합한을튼한집지,▁edit다니▁restrict선합택,▁clickions▁request다를 선택합니다.the verbs tab될 ,all verbs radio확인을 . , 하십시오. 경고가 표시될 수도 있습니다. PHP-CGI 실행에 이중 따옴표를 사용한다는 것을 보여줍니다. 그런 다음 수행하십시오.

완료되면 IIS 서버를 다시 시작하면 됩니다.

여기에 이미지 설명 입력

위의 모든 솔루션 외에도 DELETE 메서드의 "id" 또는 사용자 정의 매개 변수가 경로 구성과 일치하는지 확인합니다.

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

405개의 오류가 반복적으로 발생할 경우 메소드 서명을 위와 같이 기본값으로 재설정하고 시도하는 것이 좋습니다.

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

하지만 id의 데이터 유형을 변경할 수 있습니다.

예를 들어, 다음 방법이 제대로 작동합니다.

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

참고: 또한 payload를 본문 내용으로 전달할 데이터 메서드가 아닌 url을 통해 데이터를 전달해야 합니다.

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

예:

DELETE http://localhost/item/1

도움이 되길 바랍니다.

IIS 관리자 GUI를 사용하여 추가 HTTP 동사를 허용하는 방법은 다음과 같습니다.

  1. IIS 관리자에서 PUT 또는 DELETE를 허용할 사이트를 선택합니다.

  2. "Request Filtering" 선택사항을 누릅니다.HTTP 동사 탭을 누릅니다.

  3. 사이드바에서 "동사 허용..." 링크를 누릅니다.

  4. 상자가 나타나면 "DELETE"를 입력하고 확인을 클릭합니다.

  5. 사이드바에서 "동사 허용..." 링크를 다시 누릅니다.

  6. 상자가 나타나면 "PUT"를 입력하고 확인을 클릭합니다.

저는 MVC 애플리케이션에서 ashx 파일을 사용하고 있는데 위의 답변 중 하나도 제대로 되지 않았습니다.IIS 10.

여기에 효과가 있었습니다.IIS 또는 web.config에서 "ExtensionlessUrl-Integrated-4.0"을 변경하는 대신 "*ashx" 파일에 대해 "SimpleHandlerFactory-Integrated-4.0"을 변경했습니다.

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" 
verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
type="System.Web.UI.SimpleHandlerFactory" 
resourceType="Unspecified" requireAccess="Script" 
preCondition="integratedMode,runtimeVersionv4.0" />

추가했습니다.requireAccess="None"web.config▁this.

    <configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
                <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
                <remove name="WebDAV" />
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" requireAccess="None"/>
                <add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,DELETE,COPY,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
                <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,DELTE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
      </handlers>
      <aspNetCore processPath=".\Informing.Gateway.Api.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
    </system.webServer>
  </location>
</configuration>

그리고 그것은 성공하였다.바로 그겁니다.

오류 평가판은 이 문제를 해결하는 올바른 방법이 아닙니다.해야 할 일은 다음과 같습니다.

  • PUT/DELETE 요청을 차단하는 소스 식별
  • 그런 다음 제거하거나 비활성화하거나 더 잘 구성할 수 있습니다.

1- 소스를 알기 위해서는 IIS에서 실패한 요청 추적을 구성해야 합니다. 2- 기록할여기에 이미지 설명 입력 오류를 "추가"합니다. 로그 파일로 시스템에 과부하가 걸리지 않도록 이 추적 항목에 대해 짧은 수명을 사용해야 합니다.IIS는 각 호출에 대해 별도의 xml 파일을 생성합니다. 3 - 추적 오류 항목을 생성하기 위해 포스트맨 또는 스웨거를 사용하여 잘못된 요청을 생성합니다. 4 - 이전 화면에서 "추적 로그 보기"를 선택하여 생성된 로그 파일로 이동할 수 있습니다. 5 - Internet Explorer를 사용하여 잘못된 로그 파일을 엽니다.그리고 모든 메시지를 수락합니다. 6 - 요청을 차단하는 소스에 주목하십시오. 7 - IIS 인터페이스의 모듈 또는 매핑 핸들러 또는 다른 포스터에서 설명한 것처럼 web.config에서 요청을 비활성화합니다.

올바른 구성 파일을 편집했는지 잘 모르겠습니다.다음 단계를 수행합니다.

  1. %userprofile%\documents\iispress\config\applicationhost.config를 엽니다.

  2. 기본적으로 아래의 지정된 항목은 applicationhost.config 파일에 설명되어 있습니다.이 항목의 주석을 제거합니다.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />


<add name="WebDAVModule" />
<add name="WebDAV" path="*"
 verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK"
 modules="WebDAVModule" resourceType="Unspecified" requireAccess="None"
 />

.
는 다음 답변에 따라 웹 API용 URL을 변경했습니다.

Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })

그러나 이 방법은 다음과 같은 링크를 만듭니다.

/api/MyApiCtrl?action=MyAction

이것은 GET 및 POST 요청에서는 올바르게 작동하지만 PUT 또는 DELETE에서는 작동하지 않습니다.
그래서 그냥 다음으로 대체했습니다.

/api/MyApiCtrl

그리고 그것은 문제를 해결했습니다.

삭제 방법을 다음과 같이 POST로 변환할 수 있습니다.

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }

IIS 8.5/ Windows 2012 R2에서는 여기에 언급된 어떤 것도 제대로 작동하지 않았습니다.WebDAV 제거가 무엇을 의미하는지는 모르겠지만, 그것이 저에게 문제를 해결하지는 못했습니다.

도움이 된 것은 다음과 같은 단계입니다.

  1. IIS 매니저를 찾아갔습니다.
  2. 왼쪽 패널에서 사이트를 선택했습니다.
  3. 왼쪽 작업 영역에서 WebDAV를 선택하고 두 번 클릭합니다.
  4. 맨 오른쪽 패널에서 비활성화했습니다.

이제 모든 것이 작동하고 있습니다.

그러한 불쌍한 영혼들을 위해 간단한 aspx 파일로 PUT, PATCH 및 DELETE 요청을 처리할 수 있는 방법을 찾는 것입니다(네, 웹 양식은 지난 세기에 매우 많았지만 여전히 사용되고 있습니다).WebDav 또는 이전에 언급된 수정 사항을 제거하지 않습니다.그건…PageHandlerFactory-Integrated-4.0

이것이 간단한 asx 파일을 얻는 데 필요한 마법의 전부입니다(예:log-request.aspx) 모든 동사를 받아들입니다.

    <system.webServer>
        <handlers>
            <remove name="PageHandlerFactory-Integrated-4.0" />
            <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
    </system.webServer>

언급URL : https://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs-not-allowed-iis-8

반응형