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)

idWebApiConfig파일에 선언 된 이름이기 때문에 이름 을 사용해야 합니다. 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.