WebAPI 삭제가 작동하지 않음-405 메서드가 허용되지 않음


120

사이트가 오늘 밤 라이브로 진행될 예정이므로 이에 대한 도움을 주셔서 감사합니다!

Delete 메서드가있는 웹 API 컨트롤러가 있습니다. 이 메서드는 IIS Express (Windows 8)를 실행하는 로컬 컴퓨터에서 제대로 실행되지만 라이브 IIS 서버 (Windows Server 2008 R2)에 배포하자마자 작동이 중지되고 다음 오류 메시지가 표시됩니다.

HTTP 오류 405.0-메서드가 허용되지 않음 유효하지 않은 메서드 (HTTP 동사)를 사용하고 있기 때문에 찾고있는 페이지를 표시 할 수 없습니다.

저는 웹에서 해결책을 찾아 봤고 가장 합리적인 해결책을 구현했습니다. 내 웹 구성에는 다음 설정이 있습니다.

<system.webServer>
    <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,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

또한 IIS에서 처리기 매핑 및 요청 필터링을 아무 소용이 없도록 변경하려고했습니다. IIS의 WebDAV 제작 규칙이 비활성화 된 것 같습니다.

어떤 아이디어라도 대단히 감사하겠습니다.

답변:


199

결국 해결책을 찾았습니다! 동일한 문제가 발생하면 web.config에 다음을 추가하십시오.

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here

이게 도움이 되길 바란다



3
여기서도 일했습니다. 그러나 누군가 WebDAVModule과의 관계를 설명해 줄 수 있습니까?
— 보아스 Enkler

11
복사-붙여 넣기 만하는 사람들을 위해 : runAllManagedModulesForAllRequests = "true"는 실제로 필요하지 않으며 실제로 다른 것을 손상시킬 수 있습니다.
— Zar Shardan 2014 년

이 가장 신뢰할 수있는 방법으로, 일부 다른 웹 게시물이 비활성화에게, IIS 모듈 섹션을 사용하여 모듈을 제거하기를 제안합니다 그러나 아직도이 / 유사한 문제가 발생합니다
— 안토니 홈페이지

4
@ZarShardan (및 기타) 참고 : runAllManagedModulesForAllRequests = "true"속성을 제거하는 경우 <handlers> 노드 아래에도 <remove name = "WebDAV"/>를 추가해야합니다.
— 아론

65

어떤 경우에는 모듈에서만 제거하면 다음 오류가 발생할 수 있습니다.

500.21 처리기 "WebDAV"의 모듈 목록에 잘못된 모듈 "WebDAVModule"이 있습니다.

모듈 : IIS 웹 코어 알림 : ExecuteRequestHandler "

여기에 해결책이 제안 되었습니다 . 또한 핸들러에서 제거해야합니다.

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

1
이것은 나를 위해 작동하지만 누군가 WebDAV가 실제로 무엇인지 밝힐 수 있습니까?
— Nazrul Muhaimin

31

제 경우에는 위의 솔루션 중 어느 것도 작동하지 않았습니다. 내가했던 때문이었다 매개 변수의 이름을 변경 내에서 Delete방법.

나는 가지고 있었다

public void Delete(string Questionid)

대신에

public void Delete(string id)

id내 WebApiConfig파일에 선언 된 이름이기 때문에 이름 을 사용해야 합니다. id세 번째와 네 번째 줄 의 이름을 확인합니다.

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

나는 여기 에서이 해결책을 얻었다 .


15

HTTP DELETE동사 의 Javascript 는 다음과 같아야합니다.

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

마십시오 하지 이런 식으로 뭔가를 사용 :

...
data: {id:id}
...

POST방법 을 사용할 때처럼 .


1
안녕하세요 @Pavel, 완전히 RESTful 구현을 실제로 사용하고 있다면 맞습니다. 안타깝게도 모든 사람이이 작업을 수행하는 것은 아니며 개발자가 DELETE 대신 POST를 사용하는 경우가 많습니다.이를 명확히 해주셔서 감사합니다.
— Chris

5

여기에서 거의 모든 솔루션을 시도한 후에 이것은 나를 위해 일했습니다. API 구성 파일에 추가하십시오.

<system.webServer>
    <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>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
</system.webServer>

많은 것을 시도했지만 효과가있었습니다. .NET 버전 4.6.1-감사합니다.
— Ketan

4

IIS 7.0 이상 버전을 사용하는 경우. 이 문제는 주로 IIS 서버의 WebDAV 확장 모듈과 관련이 있습니다. 이것은 Post OR delete 작업을 사용하는 동안 발생했습니다.

웹 구성에서 아래 설정을 시도하십시오

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

3

나는 또한 같은 문제가 있었고 WebAPi를 호출하고 있으며이 오류가 발생합니다. 서비스를 위해 web.config에 다음 구성을 추가하면 문제가 해결되었습니다.

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

web.config 파일에서 내 문제를 해결했습니다. 이것이 내가 클라이언트 측에서 전화 한 방법입니다.

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(environment.ServiceUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
    if (response.IsSuccessStatusCode)
    {
        string strResult = response.Content.ReadAsAsync<string>().Result;
    }
}

2

applicationHost.config (일반적으로 C : \ Windows \ System32 \ inetsrv \ config 아래) 파일로 이동하고 applicationHost.config에서 다음 줄을 주석 처리합니다.

1) <핸들러> 아래 :

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

2) 또한 <modules>에서 위의 핸들러가 참조하는 다음 모듈을 주석 처리하십시오.

<add name="WebDAVModule" />

또는 다른 답변 stackoverflow.com/a/47907578/1754743 을 사용 하여 자신의 web.config에서 이러한 처리기를 제거하십시오. 머신 전체 구성 파일을 수정하지 않거나 수정할 수없는 경우
— Ekus

2

내 경우, 나는 추가 놓친 {id}받는 사람 [Route("")]과 나는 같은 오류가 발생했습니다. 그것을 추가하면 문제가 해결되었습니다.[Route("{id}")]


너무 많은 시간을 허비하고 당신이 아니었다면 여전히이 문제를 해결할 수 없었습니다 .... 왜 그것이 반환되지 않는지 궁금합니다. 404 : @
— deadManN

1

WebApi 컨트롤러에서 Delete 메서드를 공개하지 않았기 때문에 405 오류 메서드가 허용되지 않았습니다.

이 경우 찾을 수 없음 오류를 예상했기 때문에 이것을 찾는 데 오랜 시간이 걸렸습니다 (너무 오래!). 그래서 내 Delete 메서드가 거부되었다고 잘못 가정했습니다.

찾을 수 없음이 아닌 허용되지 않는 이유는 동일한 경로에 대한 Get 메서드도 가지고 있기 때문입니다 (REST를 구현할 때 일반적인 경우). 공용 Get 함수는 라우팅과 일치 한 다음 잘못된 http 메서드로 인해 거부됩니다.

내가 아는 간단한 오류이지만 다른 사람이 시간을 절약 할 수 있습니다.


1

추가하기 만하면됩니다. 이것이 당신의 구성이라면

config.Routes.MapHttpRoute (
            이름 : "DefaultApi",
            routeTemplate : "api / {controller} / {id}",
            기본값 : new {id = RouteParameter.Optional}

Hugo가 말한대로 계속하고 Route 속성을 컨트롤러 get 메소드로 설정하지 마십시오.


0

나는 비슷한 문제가 있었지만 PUT의 경우 다른 제안이 나를 위해 일하지 않았습니다.

그러나 나는 ID에 int대한 기본값 대신 사용 string하고있었습니다. {id:int}경로에 추가 하면 내 문제가 해결되었습니다.

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }

0

요청에 API 응답을 혼란스럽게하는 여러 헤더가 있으므로 web.config에 사용자 지정 헤더를 추가해야했습니다.

<httpProtocol>
    <customHeaders>
        <remove name="Access-Control-Allow-Methods" />
        <remove name="Access-Control-Allow-Origin" />
        <remove name="Access-Control-Allow-Headers" />
    </customHeaders>
</httpProtocol>

-1

Delete 메서드 상단의 [HttpPost] 속성이이 문제를 해결했습니다.

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}

그것이 당신을 위해 일하는 이유가 될 수 있습니다. 저는 2013 년 초에 이전 버전을 사용하고 있었기 때문에 그 이후로 많은 부분이 수정되었습니다. 그래도 효과가 있다는 것을 알게되어 기쁩니다.
— Chris

4
솔직히 말해서 좋은 대답이 아닙니다. 그 문제는이를 사용하여 해결 된 사람들은 대신 DELETE의 POST를 사용하는 것이 할 수 없으며해야하지 작업 때문에
— 알렉산더 Derck

나는 이것이 당신이 클라이언트 측에서 (즉, 요청의 URL data) 대신 params(즉, 요청의 본문)을 사용하고 있기 때문이라고 생각합니다 .
— Thomas Sauvajon

나는 Alexander Derck의 의견에 동의합니다. 이것은 해결책 이라기보다는 kludge입니다.
— Basem Sayej 2011
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.