WebAPI Delete ไม่ทำงาน - ไม่อนุญาตวิธี 405


120

ฉันขอขอบคุณสำหรับความช่วยเหลือใด ๆ ในเรื่องนี้เนื่องจากไซต์ควรจะเปิดใช้งานคืนนี้!

ฉันมีตัวควบคุมเว็บ API ที่มีวิธีการลบ วิธีการดำเนินการได้ดีบนเครื่องท้องถิ่นของฉันที่ใช้ IIS Express (Windows 8) แต่ทันทีที่ฉันปรับใช้กับเซิร์ฟเวอร์ IIS ที่ใช้งานอยู่ (Windows Server 2008 R2) ก็หยุดทำงานและแสดงข้อความแสดงข้อผิดพลาดต่อไปนี้:

HTTP Error 405.0 - Method Not Allowed เพจที่คุณกำลังค้นหาไม่สามารถแสดงได้เนื่องจากมีการใช้เมธอดที่ไม่ถูกต้อง (HTTP Verb)

ฉันได้ดูวิธีแก้ปัญหาในเว็บแล้วและได้นำวิธีที่สมเหตุสมผลที่สุดไปใช้ การกำหนดค่าเว็บของฉันมีการตั้งค่าต่อไปนี้:

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

ฉันได้พยายามเปลี่ยน Handler Mappings และ Request Filtering ใน IIS แล้วก็ไม่มีประโยชน์ โปรดทราบว่าดูเหมือนว่ากฎการสร้าง WebDAV ใน IIS จะถูกปิดใช้งาน

ความคิดใด ๆ จะได้รับการชื่นชมอย่างมากขอบคุณ

คำตอบ:


199

ในที่สุดฉันก็พบทางออก! หากคุณพบปัญหาเดียวกันให้เพิ่มสิ่งต่อไปนี้ใน web.config ของคุณ

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

ฉันหวังว่านี่จะช่วยได้


2
ฉันต้องเพิ่มการลบในส่วนตัวจัดการตามstackoverflow.com/a/6698096/254156
rrrr

3
ทำงานที่นี่ด้วย แต่ใครช่วยอธิบายความสัมพันธ์กับ WebDAVModule ได้ไหม
Boas Enkler

11
สำหรับผู้ที่คัดลอก - วาง: runAllManagedModulesForAllRequests = "true" ไม่จำเป็นจริงๆและสามารถทำลายสิ่งอื่นได้
Zar Shardan

โพสต์ในเว็บอื่น ๆ จะแนะนำให้ลบโมดูลโดยใช้ส่วนโมดูล IIS ซึ่งจะปิดใช้งาน แต่ก็ยังคงทำให้เกิดปัญหานี้ / ปัญหาที่คล้ายกันนี่เป็นวิธีที่น่าเชื่อถือที่สุด
Anthony Main

4
@ZarShardan (และอื่น ๆ ) FYI: หากคุณลบแอตทริบิวต์ runAllManagedModulesForAllRequests = "true" คุณจะต้องเพิ่ม <remove name = "WebDAV" /> ภายใต้โหนด <handlers> ด้วย
แอรอน

65

ในบางกรณีการลบออกจากโมดูลอาจทำให้เกิดข้อผิดพลาดถัดไป:

500.21 Handler "WebDAV" มีโมดูล "WebDAVModule" ที่ไม่ถูกต้องในรายการโมดูล

โมดูล: การแจ้งเตือน IIS Web Core: 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

Javascript สำหรับDELETEกริยาHTTP ต้องเป็นดังนี้:

$.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 อย่างสมบูรณ์ น่าเสียดายที่ไม่ใช่ทุกคนที่ทำเช่นนี้และเป็นเรื่องปกติที่จะเห็นนักพัฒนาใช้ POST แทน DELETE เป็นต้นขอขอบคุณที่ชี้แจงเรื่องนี้
คริส

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 หรือเวอร์ชันที่ใหม่กว่า ปัญหานี้ส่วนใหญ่เกี่ยวข้องกับโมดูลส่วนขยาย WebDAV บนเซิร์ฟเวอร์ IIS สิ่งนี้เกิดขึ้นขณะใช้การดำเนินการโพสต์หรือลบ

โปรดลองตั้งค่าด้านล่างในการกำหนดค่าเว็บ

<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) ภายใต้ <handlers>:

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

2) แสดงความคิดเห็นเกี่ยวกับโมดูลต่อไปนี้ที่อ้างถึงโดยตัวจัดการด้านบนภายใต้ <โมดูล>

<add name="WebDAVModule" />

หรือใช้คำตอบอื่นstackoverflow.com/a/47907578/1754743 เพื่อลบตัวจัดการเหล่านี้ใน web.config ของคุณเองหากคุณไม่ต้องการ (หรือไม่สามารถ) แก้ไขไฟล์กำหนดค่าทั้งเครื่องได้
Ekus

2

ในกรณีของฉันฉันพลาดที่จะเพิ่ม{id}เข้าไป[Route("")]และฉันได้รับข้อผิดพลาดเดียวกัน การเพิ่มที่ช่วยแก้ปัญหาให้ฉัน:[Route("{id}")]


เสียเวลาไปหลายชั่วโมงแล้วถ้าไม่ใช่เพราะคุณฉันก็ยังแก้ไม่ได้ .... สงสัยทำไมไม่คืน 404: @
deadManN

1

ฉันมีข้อผิดพลาด 405 วิธีที่ไม่อนุญาตเนื่องจากฉันได้ละเว้นเพื่อทำให้เมธอด Delete บนตัวควบคุม WebApi เป็นแบบสาธารณะ

ฉันใช้เวลานานในการค้นหาสิ่งนี้ (นานเกินไป!) เพราะฉันคาดว่าจะมีข้อผิดพลาดไม่พบในกรณีนี้ดังนั้นฉันจึงสันนิษฐานไม่ถูกว่าเมธอด Delete ของฉันถูกปฏิเสธ

เหตุผลที่ไม่อนุญาตแทนที่จะไม่พบคือฉันมีเมธอด Get สำหรับเส้นทางเดียวกันด้วย (ซึ่งจะเป็นกรณีปกติเมื่อใช้ REST) ฟังก์ชั่นรับสาธารณะถูกจับคู่โดยการกำหนดเส้นทางและถูกปฏิเสธเนื่องจากวิธี http ที่ไม่ถูกต้อง

ข้อผิดพลาดง่ายๆที่ฉันรู้ แต่อาจช่วยคนอื่นได้บ้าง


1

เพียงเพื่อเพิ่ม หากนี่คือการกำหนดค่าของคุณ

config.Routes.MapHttpRoute (
            ชื่อ: "DefaultApi",
            routeTemplate: "api / {controller} / {id}",
            ค่าเริ่มต้น: ใหม่ {id = RouteParameter.Optional}

โปรดทำตามที่ Hugo กล่าวต่อไปและอย่าตั้งค่าแอตทริบิวต์ Route เป็นวิธีการรับคอนโทรลเลอร์ซึ่งทำให้เกิดปัญหาในกรณีของฉัน


0

ฉันมีปัญหาที่คล้ายกัน แต่สำหรับ PUT - ไม่มีคำแนะนำอื่นใดที่ใช้ได้ผลกับฉัน

อย่างไรก็ตามฉันใช้intมากกว่าค่าเริ่มต้นstringสำหรับ id การเพิ่ม{id:int}เส้นทางช่วยแก้ปัญหาของฉัน

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

0

เราต้องเพิ่มส่วนหัวที่กำหนดเองใน web.config เนื่องจากคำขอของเรามีส่วนหัวหลายรายการที่ทำให้การตอบสนองของ API สับสน

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

-1

แอตทริบิวต์ [HttpPost] ที่ด้านบนของวิธีการลบแก้ไขปัญหานี้ให้ฉัน:

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

นั่นอาจเป็นเหตุผลว่าทำไมมันถึงได้ผลสำหรับคุณ ฉันใช้เวอร์ชันก่อนหน้าประมาณต้นปี 2013 ดังนั้นจึงมีการแก้ไขบางอย่างตั้งแต่นั้นมา ดีใจที่รู้ว่ามันใช้ได้ผลสำหรับคุณ
คริส

4
นี่ไม่ใช่คำตอบที่ดีสำหรับความซื่อสัตย์ คนที่ปัญหาได้รับการแก้ไขโดยใช้สิ่งนี้กำลังใช้ POST แทน DELETE ดังนั้นจึงไม่สามารถและไม่ควรทำงาน
Alexander Derck

ฉันเชื่อว่าเป็นเพราะคุณกำลังใช้data(เช่นเนื้อหาของคำขอ) แทนparams(เช่น url ของคำขอ) ในฝั่งไคลเอ็นต์
Thomas Sauvajon

ฉันเห็นด้วยกับ Alexander Derck นี่เป็น kludge มากกว่าวิธีแก้ปัญหา
Basem Sayej
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.