“ ไม่อนุญาตให้ใช้วิธี 405” ใน IIS7.5 สำหรับวิธี“ PUT”


113

ฉันใช้WebClientประเภทเพื่ออัปโหลดไฟล์ * .cab ไปยังเซิร์ฟเวอร์ของฉัน ทางฝั่งเซิร์ฟเวอร์ฉันลงทะเบียนตัวจัดการ HTTP สำหรับไฟล์ * .cab ด้วยวิธีการ PUT ดังนี้:

 <add name="ResultHandler" path="*.cab" verb="PUT" type="FileUploadApplication.ResultHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />

แต่ฉันมักจะได้รับข้อผิดพลาด "405 method not allowed" คำตอบกล่าวว่าวิธีการที่อนุญาตมีดังต่อไปนี้:

Headers = {Allow: GET, HEAD, OPTIONS, TRACE
Content-Length: 1293
Content-Type: text/html
Date: Fri, 27 May 2011 02:08:18 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET}

แม้ว่าฉันจะอนุญาตให้ใช้เมธอด PUT อย่างชัดเจนในการกรองคำขอ IIS สำหรับเว็บแอปพลิเคชันของฉัน แต่ข้อผิดพลาดยังคงเกิดขึ้น

ฉันสงสัยว่านี่เป็นปัญหาที่เกี่ยวข้องกับ IIS ฉันหวังว่าใครบางคนสามารถให้ความกระจ่างเกี่ยวกับเรื่องนี้ให้ฉันได้

คำตอบ:


214

บ่อยครั้งที่ข้อผิดพลาดนี้เกิดจากโมดูล WebDAV ที่พยายามจัดการคำขอประเภทนี้ วิธีแก้ปัญหาง่ายๆคือลบออกจากโมดูลและจากตัวจัดการของsystem.webServerส่วนภายในไฟล์ web.config ของคุณ นี่คือตัวอย่างการกำหนดค่า:

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

2
เมื่อใช้บทความ MS ต่อไปนี้ฉันได้เพิ่มแท็กลบไปยังตัวจัดการ แต่ก็ยังไม่ได้ผล ขอบคุณสำหรับคำตอบของคุณฉันเห็นว่าฉันจำเป็นต้องเพิ่มลงในส่วนโมดูลด้วย ชื่นชมมาก นี่คือบทความ: asp.net/web-api/overview/testing-and-debugging/…
Tod Birdsall

เยี่ยมมากคุณช่วยฉันได้หลายชั่วโมงในการแก้ไขจุดบกพร่องที่เจ็บปวด! :)
Kaspars Ozols

แก้ไขง่ายและสะดวกขอบคุณ!
MorenajeRD

ฉันพยายามแล้ว แต่ไม่ได้ผลสำหรับฉัน ฉันยังคงได้รับข้อผิดพลาด 405 - ไม่อนุญาตวิธีการ โปรดทราบว่าฉันใช้ IIS Express และข้อผิดพลาดเกิดขึ้นเฉพาะใน PUT แต่ใช้ได้กับ GET โพสต์และลบ
Thierry

47

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

 <EventData>
  <Data Name="ContextId">{00000000-0000-0000-0F00-0080000000FA}</Data>
  <Data Name="ModuleName">WebDAVModule</Data>
  <Data Name="Notification">16</Data>
  <Data Name="HttpStatus">405</Data>
  <Data Name="HttpReason">Method Not Allowed</Data>
  <Data Name="HttpSubStatus">0</Data>
  <Data Name="ErrorCode">0</Data>
  <Data Name="ConfigExceptionInfo"></Data>
 </EventData>

ดังนั้นฉันจึงถอนการติดตั้ง WebDAVModule จาก IIS ของฉันตอนนี้ทุกอย่างเรียบร้อยดี ~

คุณสมบัติการติดตาม IIS มีประโยชน์มาก


1
ขอบคุณสำหรับคำตอบ ! หลังจากนั้น 2 วันของการวิจัยเพียงการแก้ปัญหาการทำงานผมพบว่าเพื่อหลีกเลี่ยง "405 วิธีที่ไม่อนุญาตให้" คือการกำหนดส่วนหัว CORS ในApplication_BeginRequestวิธีการที่กล่าวไว้ในคำตอบนี้stackoverflow.com/a/14631068/827168 แต่คำตอบของคุณดีกว่าคำตอบอื่น ๆ เพราะช่วยระบุปัญหาแทนที่จะใช้แพทช์แบบสุ่ม :)
pomeh

@pomeh ฉันเชื่อเสมอในการทำให้ตรรกะสมบูรณ์ :)
smwikipedia

1
@Demodave ตรวจสอบที่นี่: technet.microsoft.com/en-us/library/cc731223%28v=ws.10%29.aspx
smwikipedia

1
หมายเหตุ: คุณควรเข้าไปจัดการแมปและลบ WebDAV จากที่นั่นหรืออื่น ๆ Handler "WebDAV" has a bad module "WebDAVModule" in its module listคุณจะได้รับข้อความแสดงข้อผิดพลาด
pipedreambomb

26

ฉันมีปัญหากับ WebDAV เมื่อโฮสต์โครงการ MVC4 WebApi ฉันเข้าใจได้โดยการเพิ่มบรรทัดนี้ไปที่ web.config:

<handlers>
  <remove name="WebDAV" />
  <add name="WebDAV" path="*" verb="*" modules="WebDAVModule"
      resourceType="Unspecified" requireAccess="None" />
</handlers>

ตามที่อธิบายไว้ที่นี่: http://evolutionarydeveloper.blogspot.co.uk/2012/07/method-not-allowed-405-on-iis7-website.html


ทางออกที่ดีที่สุดสำหรับผู้ที่ต้องการ WebDAV จริงๆ ไม่ว่าใครก็ตามที่ต้องการ WebDAV คือการสนทนาแยกต่างหาก
MrBoJangles

24

นำมาจากที่นี่และได้ผลสำหรับฉัน:

1. ไปที่ IIS Manager

2. คลิกที่แอปของคุณ

3. ไปที่ "Handler Mappings"

4. ในรายการคุณสมบัติให้ดับเบิลคลิกที่ "WebDAV"

5. คลิกที่ "ขอข้อ จำกัด "

6. ในแท็บ "คำกริยา" เลือก "คำกริยาทั้งหมด"

7. กด OK


3
สิ่งนี้ช่วยฉันได้ แต่ฉันจะชี้แจงด้วยประสบการณ์ของฉัน 2. แอพ (Web Service) 3. ดับเบิลคลิกที่ไอคอน Handler Mappings ที่แผงตรงกลาง
Gary

19

ฉันลองใช้คำตอบเกือบทั้งหมดแล้วและน่าเสียดายที่ไม่มีคำตอบใดได้ผล

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน มี 3 สิ่งที่ต้องทำกับไซต์ที่คุณต้องการ PUT (เลือกไซต์):

  1. เปิดWebDav Authoring Rulesแล้วเลือกDisable WebDAVตัวเลือกที่มีอยู่บนแถบด้านขวา

  2. เลือกModulesค้นหาWebDAV Moduleและลบออก

  3. เลือกHandlerMappingค้นหาWebDAVHandlerและลบออก

รีสตาร์ท IIS


ใช้งานได้! ไม่ทราบว่าทั้ง 3 ขั้นตอนสามารถทำได้โดยการแก้ไขไฟล์ web.config หรือไม่ แต่สิ่งนี้ทำให้ง่ายโดยใช้เฉพาะ IIS Management Console โปรดทราบว่ามีรายการ HandlerMapping 3 รายการที่ขึ้นต้นด้วย WebDAV * - ฉันลบทั้ง 3 รายการและชีวิตก็ดี
SlimsGhost

1
ฉันลองถอนการติดตั้ง WebDav แล้วไม่ได้ผล จากนั้นฉันทำตามทั้งสามขั้นตอนข้างต้นและPUTเริ่มทำงาน
rareyesdev

1
ขั้นตอนที่ 2 และ 3 สามารถนำไปใช้กับไดเรกทอรีเสมือนได้โดยไม่ส่งผลกระทบต่อส่วนที่เหลือของไซต์
Tonatio

1
ขอบคุณมาก. คุณช่วยฉันไว้. หลังจาก 7 ชั่วโมงหงุดหงิดพยายามตอบทุกคำถามที่ฉันทำได้และในที่สุดคำตอบของคุณก็โดนใจฉัน :)
Zeeshan Safdar

1
ขอบคุณนี่คือมัน
Ahmad Hamdy

17

การถอดโมดูล WebDAV ก็เพียงพอแล้ว เพียงแค่เปลี่ยน Web.config ของคุณ:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule" />

14

ดีที่สุดเพียงแค่ลบคุณสมบัติ WebDAV ที่ไม่ได้ใช้ ไปที่โปรแกรมและคุณลักษณะ => เปิดหรือปิดคุณลักษณะของ Windowsและปิดใช้งานการเผยแพร่ WebDAVภายใต้

บริการข้อมูลทางอินเทอร์เน็ต => บริการเวิลด์ไวด์เว็บ => คุณลักษณะ HTTP ทั่วไป

ใส่คำอธิบายภาพที่นี่


ขอบคุณ! นี่แก้ไขปัญหาของฉันโดยสิ้นเชิง!
wmehanna

4

ไม่ว่าด้วยเหตุผลใดการทำเครื่องหมาย WebDAVModule เป็น "ลบ" ใน web.config ของฉันไม่เพียงพอที่จะแก้ไขปัญหาในกรณีของฉัน

ฉันได้พบวิธีการอื่นที่ไม่ได้แก้ปัญหา หากคุณอยู่ในเรือลำเดียวกันให้ลองทำดังนี้

  1. ในตัวจัดการ IIS ให้เลือกแอปพลิเคชันที่ต้องการสนับสนุน PUT
  2. ในมุมมองของลักษณะหาWebDAV เขียนกฎ ดับเบิลคลิกหรือเลือกOpen Featureจากเมนูบริบท (คลิกขวา)
  3. ในบานหน้าต่างการดำเนินการค้นหาและคลิกบนWebDAV การตั้งค่า ...
  4. ในการตั้งค่า WebDAV ค้นหาขอกรองพฤติกรรมและภายใต้ที่พบอนุญาตให้กริยากรอง ตั้งค่าอนุญาตให้กริยาการกรองการเท็จ
  5. ในบานหน้าต่างการดำเนินการคลิกนำไปใช้

วิธีนี้จะป้องกันไม่ให้ WebDAV ปฏิเสธคำกริยาที่ไม่รองรับซึ่งจะทำให้ PUT ไหลผ่านไปยังตัวจัดการ RESTful ของคุณได้โดยไม่ติดขัด


4

เคล็ดลับอื่นจากฉัน ฉันใช้ PHP + IIS แล้วและ Handler Mappings สำหรับ PHP ไม่มีกริยา PUT

ไปที่ IIS Manager-> Your site-> Handler Mappings-> PHPxx_via_FastCGI-> Request Restrictions-> Verbs จากนั้นเพิ่ม PUT

แค่นั้นแหละ!


1
นี่คือคำตอบที่ผู้ใช้ php ต้องการ
SpeedOfRound

4

โมดูลที่สำคัญอีกโมดูลที่ต้องกำหนดค่าใหม่ก่อนที่ PUT และ DELETE จะทำงานคือคำกริยาตัวเลือก

<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="WebDAV" />
<add name="OPTIONSVerbHandler" path="*" verb="*" modules="ProtocolSupportModule" resourceType="Unspecified" requireAccess="Script" />
</handlers>

ดูโพสต์นี้ด้วย: https://stackoverflow.com/a/22018750/9376681


4

ฉันใช้ Angular 8 และเป็น. NET core API ฉันเพิ่มสิ่งต่อไปนี้ในไฟล์ web.config บริการของฉัน ที่แก้ไขข้อผิดพลาดของฉัน

<system.webServer>
  <modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
  </modules>
</system.webServer>


2

สำหรับฉันข้อผิดพลาดนี้จะไม่หายไปและอนุญาตให้ใช้วิธีการ PUT ไม่ว่าฉันจะทำอะไร .. ถอนการติดตั้ง webdav วางการกำหนดค่าใน web.config เพื่อลบ webdav จากตัวจัดการและโมดูลและตั้งค่า PUT เป็นคำกริยาที่อนุญาตในตัวกรองคำขอบน iis .. และตรวจสอบให้แน่ใจว่าการแมปตัวจัดการ iis ที่จัดการคำขอมีการกำหนดค่า PUT แล้ว ..

ในที่สุดปัญหาของฉันเกิดจากการติดตั้ง ASP.NET 4.5 Extensions ไม่ดี ลบทุกอย่างที่เกี่ยวข้องกับ asp.net ออกจากบทบาทและคุณสมบัติของเซิร์ฟเวอร์ เริ่มใหม่ อ่านบทบาทและเริ่มต้นใหม่ ทุกอย่างทำงานร่วมกับ config ข้างต้น

--- ด้านล่างนี้จะทำให้ PUT ได้รับการยอมรับ แต่จะส่งไปยังตัวจัดการที่ไม่ถูกต้อง - สนใจด้านล่าง

ในที่สุดการเพิ่มคำกริยา PUT เป็นคำกริยาที่อนุญาตในการทำแผนที่ตัวจัดการ TRACE บน iis ได้ผล .. เนื่องจากฉันได้เปิดใช้งานการติดตามข้อผิดพลาดที่ล้มเหลวและคำกริยานี้ไม่อนุญาตให้ใช้คำกริยา

ครั้งสุดท้ายที่ฉันมีปัญหาเดียวกันกับ IIS ของเซิร์ฟเวอร์อื่นมันเป็นเพราะไม่มี '/' ที่ท้าย URL เนื่องจากใช้ตัวจัดการเริ่มต้นโดยไม่ใช้เอกสารเริ่มต้นและตอนนี้ฉันก็รู้แล้วว่า .. ดังนั้นตรวจสอบ IIS การแมปตัวจัดการหากไม่มีอะไรช่วย


2

ฉันมีปัญหานี้ แต่ไม่มีอะไรเกี่ยวข้องกับ WebDAV คือปัญหา ในกรณีของฉันลูกค้ากำลังส่ง POST ไปที่ www.myServer.com/api/chart การเรียกนี้ควรได้รับการจัดการโดย "ExtensionlessUrlHanlder-Integrated-4.0" อย่างไรก็ตามโครงสร้างไฟล์ในเครื่องถูกสร้างขึ้นในไดเรกทอรีเซิร์ฟเวอร์ของฉัน "... \ Server \ api \ chart \" ซึ่งหมายความว่ามีการเรียกตัวจัดการ "StaticFile" แทน การลบไฟล์ในเครื่องเหล่านั้นสามารถแก้ปัญหาได้ในที่สุด


2

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

เปิด IIS และคลิกที่ไซต์ของคุณ

1 - Double Click on the Modules 2 - Right Click on WebDavPublishing and remove. 3 - Restart running WebSite.


1

สำหรับ Windows server 2012 -> ไปที่ Server manager -> Remove Roles and Features -> Server Roles -> Web Server (IIS) -> Web Server -> Common HTTP Features -> Uncheck WebDAV Publishing และลบออก -> รีสตาร์ทเซิร์ฟเวอร์


0

หากพูลแอป IIS ทำงานภายใต้โหมดคลาสสิกตรวจสอบให้แน่ใจว่าคุณมีสิ่งต่อไปนี้ใน web.config ของคุณ

<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />

    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />

0

ในกรณีของฉันฉันได้ย้าย Web Deploy ไปยังพอร์ตอื่นซึ่งเป็นพอร์ต IIS ด้วย (ไม่ใช่ 80) ในตอนแรกฉันไม่ทราบ แต่แม้ว่าจะไม่มีข้อผิดพลาดใด ๆ ในการทำงานภายใต้พอร์ตเดียวกัน แต่ดูเหมือนว่า Web Deploy มักจะตอบสนองก่อนแทนที่จะเป็น IIS ด้วยเหตุผลบางประการทำให้เกิดข้อผิดพลาดนี้ ฉันเพิ่งย้ายการผูก IIS ของฉันไปยังพอร์ตอื่นและทุกอย่างก็เรียบร้อยดี ;)


0

เพื่อป้องกันไม่ให้ WebDav เปิดใช้งานเลยให้ลบรายการต่อไปนี้ออกจาก ApplicationHost.config: <add name="WebDAVModule" />

รายการจะอยู่ในส่วนโมดูล

ตำแหน่งที่แน่นอนของการกำหนดค่า: C:\Windows\System32\inetsrv\config\applicationHost.config


0

ฉันมีปัญหาเดียวกันกับ RESTful API ที่ทำงานบน aspnet core

ฉันไม่ต้องการถอนการติดตั้ง WebDAV และฉันได้ลองใช้วิธีแก้ไขส่วนใหญ่ที่อธิบายไว้ข้างต้นแล้ว ฉันพยายามตั้งค่าคำกริยา = "*" ทั้งบนไซต์และบนเซิร์ฟเวอร์เอง แต่ไม่ประสบความสำเร็จ

เคล็ดลับสำหรับฉันมีดังต่อไปนี้:

ตัวจัดการ IIS -> ไซต์ -> MySite -> HandlerMappings -> aspNetCore -> แก้ไข

-> ขอข้อ จำกัด -> การเข้าถึง -> ไม่มี (มันคือสคริปต์)

หลังจากนั้นทุกอย่างก็ใช้ได้แม้ว่าฉันจะเปลี่ยนตัวเลือก WebDAV ดั้งเดิม

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