ASP.NET 웹 API-PUT 및 DELETE 동사 허용되지 않음-IIS 8


145

최근에 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에서는 그렇게 할 수 없습니다.

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

나는 이것에 너무 오래 보냈다. PUT 및 DELETE를 활성화하는 간단한 방법이 있어야합니까?


이것은 여전히 ​​RTM 버전에서 고장났습니다. 이 작업에 3 시간을 낭비했습니다 ...에 추가 동사를 추가하기 만하면됩니다 ExtensionlessUrl-Integrated-4.0.
leppie

1
나는 이것이 깨 졌다고 생각하지 않지만 의도적으로 설계된 것입니다. 기본 동작을 변경하면 WebDAV를 방해하고 이전 버전과의 호환성을 잃을 것이라고 생각합니다. WebDAV가 설치되었을 때 IIS7에서도 작동하지 않았습니다.
Mark

나는 또한이 게시물 후 6 년 만에 3 시간을 낭비했습니다.
브라이언 젠킨스

답변:


162

괜찮아. 나는 마침내 이것의 바닥에 도착했다. IIS8에서 PUT 및 DELETE 동사가 올바르게 작동하려면 일부 후프를 뛰어 넘어야합니다. 실제로 VS 2012의 릴리스 후보를 설치하고 새 WEB API 프로젝트를 작성하면 샘플 PUT 및 DELETE 메소드가 기본적으로 404 오류를 리턴 함을 알 수 있습니다.

웹 API와 함께 PUT 및 DELETE 동사를 사용하려면 다음과 같이 % userprofile % \ documents \ iisexpress \ config \ applicationhost.config를 편집하고 ExtensionlessUrl 핸들러에 동사를 추가해야합니다.

이 줄을 바꾸십시오 :

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

또한 기본 웹 API 규칙은 메소드 이름이 호출 된 HTTP 동사와 동일해야한다는 것입니다. 예를 들어 HTTP 삭제 요청을 보내는 경우 기본적으로 메소드 이름은 Delete로 지정해야합니다.


9
IIS8의 OPTIONS 동사와 비슷한 문제 (처리기 전에 다른 것이 가로채는 위치)는 web.config에서 <remove name = "OPTIONSVerbHandler"/>를 시도하십시오. 그 문제에 대해 가능한 한 일반적인 규칙으로 applicationhost.config를 망칠 ​​경우 로컬 web.config에서 "제거"기술을 사용하는 것이
Jason

7
서버 수준에서 WebDAV를 제거하는 대신, 다음과 같이 프로젝트에서 제거하는 것이 좋습니다. stackoverflow.com/a/14465655/428280
Twisted

그 다음엔? 로컬에서도 작동하지만 Azure에서는 작동하지 않을 수 있습니다.
Toolkit

3
개발자 컴퓨터에서도 시스템 설정을 수정하도록 지시하는 대답은 대답이 될 수 없습니다. 이것은 증상을 해결하고 실제로 팀과 생산에 도움이되지 않습니다. 모든 머신에서 이것을 복제 하시겠습니까? Santosh Sah 답변을 확인하십시오.
André Werlang

또한 Santosh Sah의 답변에WebDAVModule 따라 모듈 섹션에서 모듈 을 제거해야했습니다 .
Ivaylo Slavov

125

아래와 같이 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>

3
WebDavModule을 제거하는 것이이 문제를 해결하는 올바른 방법입니다.
MissRaphie

6
저장된 내 일 : <모듈 runAllManagedModulesForAllRequests = "진정한"> <제거 이름 = "WebDAVModule"/> </ 모듈>
피터 Stegnar

3
사용자 정의 헤더는 CORS와 관련되어 있으므로 보안 허점을 유발할 수 있으므로 필요하지 않습니다. WebDAVModule관련 부분 만 관련 이 있습니다.
André Werlang

2
이 답변은 핸들러 이름이 IIS 버전마다 다를 수 있다는 점을 제외하고는 정확합니다. 예를 들어 7.5는 "ExtensionlessUrlHandler-Integrated-4.0"위의 답변에서와 같이 IIS를 사용하지만 IIS 8.5 의 이름은 ( S 마크로"ExtensionlessUrl-Integrated-4.0" 도 언급됩니다 .) 핸들러 이름은 .. 당신이 오류가 발생하면, 세트에 내가 다른 호스팅 환경을 지원하기 위해 두 이름을 사용하는 알 사소한해야하므로, 오류 페이지를 IIS
Ivaylo Slavov을

7
runAllManagedModulesForAllRequests = "true"-해결책으로 britishdeveloper.co.uk/2010/06/…
Oliver

61

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를 통해 문제를 해결하는 것이 좋습니다. 앱이 다른 컴퓨터에서 호스팅되는 경우 발생하지 않을 것입니다.


이것은 다른 사람들이 어떤 이유로 든 IIS 8.5에 있었기 때문에 감사했습니다.
John

4
WebDAVModule을 제거하면 처리기 WebDAV (IIS 8.0)를 제거 할 필요가 없습니다.
PeterS

3
webdav를 제거하는 것은 프레임 워크 4.6.2에서 작동합니다. iis8.5
Abdul Rehman Sayed

45

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

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


1
이미 다른 줄을 작성했지만 작동하지 않았습니다. <remove name = "WebDAVModule"/> 및 <remove name = "WebDAV"/> 행을 추가 한 후 작동 중입니다. 내 편에서 많이 감사합니다.
Banketeshvar Narayan

이것은 작동하지만 web.config에서 <modules>를 사용하지 못하게하는 구성 잠금으로 인해 실패 할 수 있습니다. 이 경우 applicationHost.config에서 구성 잠금을 비활성화해야합니다. 어떤 이유로 applicationHost.config를 제어 할 수없는 경우이 방법을 사용할 수 없습니다.
플로리안 겨울

난 그냥 사용하지만 동사로 "*", IIS10로 일했다
하비에르 G.

1
IIS 10 및 Web API 2에서 작업했습니다. 작업 한 후에 온라인에서 찾은 다른 "솔루션"이 추가되지 않았습니다. 감사!
매트 웨스트

@ChrisMarisic : 감사합니다!
Div Tiwari

18

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

System.web 태그 안에 다음 코드를 추가하십시오.

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

아래 코드로 system.webserver 태그를 바꾸십시오

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


IIS 7.5에서이 문제가 발생했으며이 수정 프로그램은 완벽하게 작동했습니다. 내 system.webserver 내용을 모두 삭제하는 대신 위의 관련 설정을 내 설정으로 병합했습니다.
Keith Walton

38
주의 : 위 코드의 사용자 정의 헤더 섹션을 사용하면 모든 사이트에서 브라우저에서 API를 호출 할 수 있습니다 . 이는 큰 보안 위험 요소 입니다. CORS에 대해 읽으십시오.이 헤더는 실제로 활성화되어 있습니다.
profMamba

iis 7.5 에서도이 문제가 있었고 이것이 효과가있었습니다. 모든 사람에게 cors를 열 때 발생하는 위험에 대한 위의 툴킷 메시지를 읽으십시오. 또한 그런 소문은 매우 귀중하기 때문에 그의 의견을 찬성합니다.
sjdirect

이 경우에는 사용자 정의 헤더가 전혀 필요하지 않다고 생각합니다. system.webserver섹션 의 나머지 부분 만으로도 충분 합니다. 확장명없는 URL 처리기에 올바른 이름 을 지정하십시오.
Ivaylo Slavov

1
@niico 신뢰할 수있는 사이트 만 Access-Control-Allow-Origin에 액세스하도록 허용해야합니다. 즉, "*"를 웹 사이트 URL로 바꾸십시오. 이 속성은 전체 웹 (일반적으로 나쁜 생각)을 신뢰하지 않는 한 모든 신뢰할 수있는 사이트의 허용 목록입니다.
profMamba

5

이것은 다른 답변과 함께 iis8에서 나를 위해 일했습니다. 내 오류는 구체적으로 404.6이었다

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

AppCmd를 실행할 때 이것이 web.Config에 적용됩니다 (applyToWebDAV 비트 제외).
체이스 플 로렐

5

이 문제가 발생할 수있는 다른 사용자를위한 빠른 업데이트입니다. 오늘 현재 % userprofile % \ documents \ iisexpress \ config \ applicationhost.config를 변경해도 더 이상 작동하지 않습니다 (지금까지는 Windows 업데이트로 인한 것인지 확실하지 않습니다). 몇 시간 동안 좌절 한 후 web.config를 변경하여 작동하도록 system.webserver에 이러한 핸들러를 추가했습니다.

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

4

CORS 활성화 (좋고 깔끔함)

1. CORS nuget 패키지 추가

Install-Package microsoft.aspnet.webapi.cors

2. WebApiConfig.cs 파일에서 등록 방법에 다음 코드를 추가하십시오.

config.EnableCors();

예 :
System.Web.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 }
        );           
    }
}
}

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

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

전의:

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


4

아무것도 효과가 없으면 아래 단계를 통해이 문제를 해결할 수있었습니다.

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


3

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

IIS 로깅 설정으로 이동했습니다 :> 로그 파일보기. 필자의 경우 W3SVC4는 최신 날짜의 폴더이며 폴더를 열고 최신 로그 파일을 조회 한 후 다음 항목을 확인했습니다. GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

업데이트 방법이 동사 GET과 함께 나열되었습니다. 그래서 나는 거부로 UrlScan을 검색 하고이 링크를 찾았습니다 : UrlScan Broke My Blog .

나는 여기에 갔다 : % windir % \ system32 \ inetsrv \ urlscan \ UrlScan.ini

기본적으로 UrlScan은 PUT 및 DELETE 동사를 차단했습니다. 이 INI 파일을 열고 PUT 및 DELETE를 AllowVerbs에 추가하고 DenyVerbs 목록에서 제거했습니다. INI 파일을 저장했는데 작동했습니다! 그래서 나를 위해 ExtensionlessUrlHandler 힌트 옆 에이 단계가 필요했습니다.

Windows Webserver 2008 R2 (64 비트), IIS 7.5 DotNetNuke (DNN) WebAPI와 함께 이것을 사용하고 있습니다. ASP.Net 4.0 내 업데이트 방법 :

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

3

PHP의 경우 다음과 같습니다.

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

나는 이것이 다른 처리기와도 작동 할 것이라고 생각합니다.


2

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

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

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

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

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

예를 들어 아래 방법은 제대로 작동합니다.

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

참고 : 페이로드를 본문 컨텐츠로 전달하는 데이터 메소드가 아니라 URL을 통해 데이터를 전달해야합니다.

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

예:

DELETE http://localhost/item/1

도움이 되길 바랍니다.


2

나는 너와 같은 문제에 직면했다가 해결했다. 여기 해결책이있다.
우선

IIS modules구성에서 WebDAVModule을 루프 업 하십시오 (웹 서버에있는 경우).

둘째

IIS handler mappings구성에서 활성화 처리기 목록을보고 the PHP item편집 페이지에서 요청을 편집하고 요청 제한 단추를 클릭 한 다음 the verbs tab모달에서 처리 할 동사 지정 레이블을 선택하고all verbs radio 다음, 클릭 OK, 당신은 또한 경고를 볼 수 있습니다, 그것은 PHP-CGI 실행에 큰 따옴표를 사용하는 것을 보여줍니다.

완료되면 IIS 서버를 다시 시작하면 괜찮습니다.

여기에 이미지 설명을 입력하십시오


1
IIS 웹 사이트에서 WebDAVModule 만 제거했으며 저에게 효과적이었습니다
Umair Malhi

1

올바른 구성 파일을 편집했는지 확실하지 않습니다. 다음 단계를 시도하십시오

  1. % userprofile % \ ducuments \ iisexpress \ 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"
 />

4
applicationhost.config를 망쳐 놓습니까? nope
툴킷

하나는 응용 프로그램 구성 파일 이외의 다른 것과 혼동해서는 안됩니다. 먼저 전체 서버에 대해이 작업을 수행하고 잊어 버린 다음 많은 사람들이이 시스템에서 어떻게 작동하는지 궁금해하고 나머지 시스템에서는 작동하지 않습니다. 또한 응용 프로그램이 호스팅되는 서버에서 IIS 구성 파일에 액세스 할 수없는 경우 web.config에서 해결해야합니다. dev 서버에 위의 업데이트가 있다고 상상해보십시오. web.config가 정확합니까? 프로덕션 배포가 실패한 이유를 조사하는 데있어 누군가의 하루를
허비

1

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

  1. IIS 관리자에서 PUT 또는 DELETE를 허용 할 사이트를 선택하십시오.

  2. "요청 필터링"옵션을 클릭하십시오. "HTTP 동사"탭을 클릭하십시오.

  3. 사이드 바에서 "동사 허용 ..."링크를 클릭하십시오.

  4. 나타나는 상자에 "삭제"를 입력하고 확인을 클릭하십시오.

  5. 사이드 바에서 "동사 허용 ..."링크를 다시 클릭하십시오.

  6. 상자에 "PUT"을 입력하고 확인을 클릭하십시오.


좋은 시도-한 번 다른 무언가-여전히 작동하지 않았습니다!
ozzy432836

나는 SO와 다른 곳에서 제안 된 다른 모든 것을 시도했다. 나는 마침내 이것을 시도했고 완벽하게 작동했습니다. 필자의 경우 PUT 및 DELETE 동사가 이미 목록에 있었고 먼저 제거 한 다음 동사 허용 ... 링크를 사용하여 다시 추가해야했지만 여전히 아무것도 없었을 때 작동했습니다. 정말 고맙습니다!
JTennessen

1

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

0

또 다른 이유는 다음과 같습니다. 이 답변
에 따라 Web Api 메서드에 대한 URL을 변경했습니다 .

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

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

/api/MyApiCtrl?action=MyAction

이것은 GET 및 POST 요청에서는 올바르게 작동하지만 PUT 또는 DELETE에서는 작동하지 않습니다.
그래서 나는 그것을 다음과 같이 바꿨습니다.

/api/MyApiCtrl

문제가 해결되었습니다.


0

IIS 8.5 / Windows 2012R2에서는 여기에 언급 된 내용이 없습니다. WebDAV 제거가 무엇을 의미하는지 모르겠지만 문제가 해결되지 않았습니다.

나를 돕는 것은 다음 단계입니다.

  1. IIS 관리자에게 갔다.
  2. 왼쪽 패널에서 사이트를 선택했습니다.
  3. 왼쪽 작업 영역에서 WebDAV를 선택하고 두 번 클릭하여 열었습니다.
  4. 가장 오른쪽 패널에서 비활성화하십시오.

이제 모든 것이 작동합니다.


-1

Delete 메소드를 POST로 변환 할 수 있습니다.

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.