“Phương thức 405 không được phép” trong IIS7.5 đối với phương pháp “PUT”


113

Tôi sử dụng WebClientloại để tải tệp * .cab lên máy chủ của mình. Ở phía máy chủ, tôi đã đăng ký một trình xử lý HTTP cho tệp * .cab với phương thức PUT như bên dưới:

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

Nhưng tôi luôn gặp lỗi "phương pháp 405 không được phép". Phản hồi cho biết các phương pháp được phép như sau:

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}

Ngay cả khi tôi cho phép rõ ràng phương thức PUT trong Bộ lọc Yêu cầu IIS cho ứng dụng web của mình, lỗi tương tự vẫn xảy ra.

Tôi nghi ngờ đây là một vấn đề liên quan đến IIS. Tôi hy vọng ai đó có thể làm sáng tỏ điều này cho tôi.

Câu trả lời:


214

Thông thường, lỗi này là do mô-đun WebDAV cố gắng xử lý loại yêu cầu này. Một giải pháp dễ dàng là xóa nó khỏi các mô-đun và khỏi các trình xử lý của system.webServerphần ngay bên trong tệp web.config của bạn. Đây là một ví dụ cấu hình:

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

2
Sử dụng bài viết MS sau, tôi đã thêm thẻ loại bỏ vào trình xử lý, nhưng nó vẫn không hoạt động. Cảm ơn câu trả lời của bạn, tôi thấy tôi cũng cần thêm nó vào phần mô-đun. Nhiều đánh giá cao. Đây là bài viết: asp.net/web-api/overview/testing-and-debugging/…
Tod Birdsall

Tuyệt vời, bạn đã tiết kiệm cho tôi hàng giờ gỡ lỗi đau đớn! :)
Kaspars Ozols

Sửa chữa đơn giản và dễ dàng, Cảm ơn!
MorenajeRD

Tôi đã thử điều đó nhưng không hiệu quả với tôi. Tôi vẫn gặp lỗi 405 - Phương pháp không được phép. Lưu ý rằng tôi đang sử dụng IIS Express và bằng cách nào đó lỗi chỉ xảy ra trên PUT nhưng lại hoạt động với GET, POST VÀ DELETE.
Thierry

46

Tôi đã bật Theo dõi yêu cầu không thành công và nhận được thông tin sau:

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

Vì vậy, tôi đã gỡ cài đặt WebDAVModule khỏi IIS của mình, hiện tại mọi thứ đều ổn ~

Tính năng theo dõi IIS rất hữu ích.


1
Cảm ơn câu trả lời của bạn ! Sau 2 ngày nghiên cứu, giải pháp hiệu quả duy nhất mà tôi tìm thấy để tránh "Phương pháp 405 Không được phép" là xác định tiêu đề CORS trong Application_BeginRequestphương thức, như đã đề cập trong câu trả lời này stackoverflow.com/a/14631068/827168 . Nhưng câu trả lời của bạn là tốt hơn so với tất cả khác vì nó giúp phát hiện các vấn đề thay vì áp dụng một số bản vá ngẫu nhiên :)
pomeh

@pomeh Tôi luôn tin tưởng vào việc làm cho logic hoàn chỉnh. :)
smwikipedia


1
Lưu ý, bạn cũng nên vào Handler Mappings và xóa WebDAV khỏi đó, nếu không bạn sẽ nhận được thông báo lỗi Handler "WebDAV" has a bad module "WebDAVModule" in its module list.
pipedreambomb

26

Tôi gặp sự cố này với WebDAV khi lưu trữ Dự án WebApi MVC4. Tôi đã giải quyết vấn đề đó bằng cách thêm dòng này vào web.config:

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

Như được giải thích ở đây: http://evolproofdeveloper.blogspot.co.uk/2012/07/method-not-allowed-405-on-iis7-website.html


Giải pháp tốt nhất cho những người thực sự cần WebDAV. Có ai cần WebDAV hay không là một cuộc thảo luận riêng.
MrBoJangle

24

Lấy từ đây và nó đã làm việc cho tôi:

1. Đi tới Trình quản lý IIS.

2. nhấp vào ứng dụng của bạn.

3. Đi tới "Bản đồ xử lý".

4. trong danh sách tính năng, nhấp đúp vào "WebDAV".

5. nhấp vào "Yêu cầu hạn chế".

6. Trong tab "Động từ", chọn "Tất cả các động từ".

7. nhấn OK.


3
Điều này đã giúp tôi, nhưng tôi sẽ làm rõ với kinh nghiệm của mình. 2. Ứng dụng (Dịch vụ Web). 3. nhấp đúp vào biểu tượng Handler Mappings trong bảng điều khiển trung tâm.
Gary

19

Tôi đã thử hầu hết các câu trả lời và thật không may, không có câu trả lời nào hoạt động hoàn chỉnh.

Đây là những gì đã làm việc cho tôi. Có 3 điều cần làm đối với trang web bạn muốn PUT (chọn trang web):

  1. Mở WebDav Authoring Rulesvà sau đó chọn Disable WebDAVtùy chọn hiện trên thanh bên phải.

  2. Chọn Modules, tìm WebDAV Modulevà xóa nó.

  3. Chọn HandlerMapping, tìm WebDAVHandlervà xóa nó.

Khởi động lại IIS.


Những công việc này! Không biết liệu tất cả 3 bước có thể được thực hiện bằng cách chỉnh sửa tệp web.config hay không, nhưng điều này đã giúp bạn dễ dàng chỉ sử dụng Bảng điều khiển quản lý IIS. Chỉ cần lưu ý rằng có 3 mục HandlerMapping bắt đầu bằng WebDAV * - Tôi đã xóa cả 3 và cuộc sống vẫn tốt.
SlimsGhost

1
Tôi đã thử gỡ cài đặt WebDav nhưng không hoạt động. Sau đó, tôi làm theo cả ba bước trên và PUTbắt đầu làm việc.
Rareyesdev

1
Bước 2 và 3 có thể được áp dụng cho một thư mục ảo mà không ảnh hưởng đến phần còn lại của trang web.
Tonatio

1
Cảm ơn rất nhiều. Bạn đã cứu tôi. Sau 7 giờ thất vọng, đã thử tất cả các câu trả lời mà tôi có thể và cuối cùng câu trả lời của bạn đã đánh trúng tôi. :)
Zeeshan Safdar

1
Cảm ơn, đây là nó.
Ahmad Hamdy

17

Việc xóa mô-đun WebDAV là đủ. Chỉ cần thay đổi Web.config của bạn:

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

14

Tốt nhất là chỉ cần loại bỏ tính năng WebDAV không sử dụng. Đi tới Chương trình và Tính năng => Bật hoặc Tắt các Tính năng của Windows và tắt Xuất bản WebDAV trong

Dịch vụ thông tin Internet => Dịch vụ web toàn cầu => Tính năng HTTP phổ biến

nhập mô tả hình ảnh ở đây


Cảm ơn ! Điều này hoàn toàn khắc phục sự cố của tôi!
wmehanna,

4

Vì bất kỳ lý do gì, việc đánh dấu WebDAVModule là "loại bỏ" trong web.config của tôi không đủ để khắc phục sự cố trong trường hợp của tôi.

Tôi đã tìm thấy một cách tiếp cận khác đã giải quyết được vấn đề. Nếu bạn đang ở cùng một con thuyền, hãy thử điều này:

  1. Trong Trình quản lý IIS, chọn ứng dụng cần hỗ trợ PUT.
  2. Trong Dạng xem Tính năng, tìm Quy tắc tác giả WebDAV . Bấm đúp vào nó hoặc chọn Mở Tính năng từ menu ngữ cảnh (bấm chuột phải).
  3. Trong Actions pane, tìm và click vào WebDAV Cài đặt ... .
  4. Trong Cài đặt WebDAV, hãy tìm Hành vi lọc yêu cầu và trong phần đó, hãy tìm Cho phép lọc động từ . Đặt Cho phép Lọc động từ thành Sai .
  5. Trong ngăn Tác vụ, bấm Áp dụng .

Điều này ngăn WebDAV từ chối các động từ mà nó không hỗ trợ, do đó cho phép PUT đi qua trình xử lý RESTful của bạn mà không bị cản trở.


4

Một mẹo khác từ tôi. Tôi đã sử dụng PHP + IIS và Bản đồ xử lý cho PHP không có động từ PUT.

Đi tới Trình quản lý IIS-> Trang web của bạn-> Ánh xạ xử lý-> PHPxx_via_FastCGI-> Yêu cầu hạn chế-> Động từ, sau đó thêm PUT.

Đó là nó!


1
Đây là câu trả lời mà người dùng php cần.
SpeedOfRound

4

Một mô-đun quan trọng khác cần cấu hình lại trước khi PUT và DELETE hoạt động là động từ tùy chọn

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

Cũng xem bài đăng này: https://stackoverflow.com/a/22018750/9376681



3

Tôi đang sử dụng Angular 8 và là API lõi .NET. Tôi thêm phần sau vào tệp web.config dịch vụ của mình. Điều đó giải quyết lỗi của tôi.

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

2

Đối với tôi, lỗi này sẽ không biến mất và cho phép các phương thức PUT, dù tôi đã làm gì .. gỡ cài đặt webdav, đặt cấu hình vào web.config để xóa webdav khỏi trình xử lý và mô-đun, đồng thời thiết lập PUT làm động từ được phép trên bộ lọc yêu cầu trên iis .. và đảm bảo ánh xạ trình xử lý iis xử lý yêu cầu đã được định cấu hình PUT ..

Vấn đề của tôi cuối cùng là do cài đặt phần mở rộng ASP.NET 4.5 không hợp lệ. Đã xóa mọi thứ liên quan đến asp.net khỏi vai trò và tính năng máy chủ. đã khởi động lại. đã đọc các vai trò và bắt đầu lại. mọi thứ đều hoạt động với cấu hình trên.

--- Dưới đây sẽ làm cho PUT được chấp nhận, nhưng sẽ gửi nó đến người xử lý sai. --ignore bên dưới

cuối cùng, việc thêm động từ PUT làm động từ được phép trên TRACE xử lý ánh xạ trên iis đã hoạt động .. vì tôi đã bật tính năng dò tìm lỗi không thành công và động từ này không cho phép động từ.

lần trước tôi đã gặp vấn đề tương tự trên IIS của máy chủ khác, đó là do thiếu '/' ở cuối URL vì nó đang sử dụng trình xử lý mặc định mà không sử dụng tài liệu mặc định và bây giờ tôi nhận ra rằng .. vì vậy hãy kiểm tra IIS xử lý ánh xạ nếu không có gì khác hữu ích.


2

Tôi gặp sự cố này nhưng không có gì liên quan đến WebDAV là vấn đề. Trong trường hợp của tôi, khách hàng đang gửi ĐĂNG đến www.myServer.com/api/chart. Cuộc gọi này sẽ được xử lý bởi "ExtensionlessUrlHanlder-Integrated-4.0", tuy nhiên, bằng cách nào đó, cấu trúc tệp cục bộ đã được tạo trong thư mục máy chủ "... \ Server \ api \ chart \" của tôi. Điều này có nghĩa là trình xử lý "StaticFile" đang được gọi thay thế. Việc xóa các tệp cục bộ đó cuối cùng đã giải quyết được vấn đề.


2

Đây là những gì đã làm việc cho tôi:

Mở IIS và nhấp vào Trang web của bạn.

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


1

Đối với Windows server 2012 -> Đi tới Trình quản lý máy chủ -> Xóa vai trò và tính năng -> Vai trò máy chủ -> Máy chủ web (IIS) -> Máy chủ web -> Tính năng HTTP chung -> Bỏ chọn Xuất bản WebDAV và xóa nó -> Khởi động lại máy chủ.


0

Nếu nhóm ứng dụng IIS đang chạy ở chế độ cổ điển, hãy đảm bảo rằng bạn có phần sau trong web.config của mình

<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

Trong trường hợp của tôi, tôi đã chuyển vị trí Web Deploy sang một cổng khác, đó cũng là cổng IIS (không phải 80). Lúc đầu, tôi không nhận ra, nhưng mặc dù không có lỗi nào khi chạy cả hai dưới cùng một cổng, có vẻ như Web Deploy rất có thể đang phản hồi trước thay vì IIS vì một số lý do, gây ra lỗi này. Tôi vừa chuyển ràng buộc IIS của mình sang một cổng khác và tất cả đều ổn. ;)


0

Để ngăn không cho WebDav được bật, hãy xóa mục nhập sau khỏi ApplicationHost.config: <add name="WebDAVModule" />

Mục nhập nằm trong phần mô-đun.

Vị trí chính xác của cấu hình: C:\Windows\System32\inetsrv\config\applicationHost.config


0

Tôi đã gặp vấn đề tương tự, với một API RESTful chạy trên lõi aspnet.

Tôi không muốn gỡ cài đặt WebDAV và tôi đã thử hầu hết các biện pháp được mô tả ở trên. Tôi đã cố gắng đặt các động từ = "*" cả trên trang web và trên chính máy chủ, nhưng không thành công.

Bí quyết cho tôi là gì:

IIS Manager -> Sites -> MySite -> HandlerMappings -> aspNetCore -> Edit

-> Yêu cầu hạn chế -> Truy cập -> Không có (đó là Script).

Sau đó mọi thứ hoạt động, ngay cả khi tôi đã thay thế các tùy chọn WebDAV ban đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.