API Web Asp.NET - 405 - Động từ HTTP được sử dụng để truy cập trang này không được phép - cách đặt ánh xạ trình xử lý


106

Tôi đã viết dịch vụ REST bằng ASP.NET Web API. Tôi đang cố gắng gửi yêu cầu HttpDelete, tuy nhiên tôi gặp lỗi sau:

405 - Động từ HTTP được sử dụng để truy cập trang này không được phép

Tôi nghĩ rằng tôi đã gần đến giải pháp, tôi phát hiện ra rằng tôi nên bật quản lý từ xa IIS, chuyển đến phần Handler Mappings và thêm động từ DELETE vào vị trí thích hợp ... nhưng vấn đề là có rất nhiều vị trí khác nhau trên danh sách ... (sth như đây: http://www.somacon.com/p126.php ).

Tôi nên chỉnh sửa cái nào? Một vài trong số chúng không có tiện ích mở rộng, ví dụ: "ExtensionUrlHandler-Integrated-4.0" và tôi đã thêm động từ DELETE vào nó, nhưng nó vẫn không hoạt động ...

Nó chỉ là một cảnh quay trong bóng tối để sửa đổi cái đó, vậy tôi có nên sửa đổi vị trí khác không? Nếu vậy thì cái nào? Hoặc có thể có bất cứ điều gì nhiều hơn những gì tôi nên làm?

Dịch vụ web tương tự hoạt động hoàn toàn tốt trên dịch vụ cục bộ của tôi, vì vậy tôi đoán vấn đề là với IIS từ xa ...

Lời chào hỏi


3
Này Bart. Bạn có thể thay đổi câu trả lời cho web.config một không? Nó thực sự tốt hơn là gỡ cài đặt nó. và bạn có rất nhiều người xem
Ashkan Sirous

Câu trả lời:


28

Nguyên nhân phổ biến cho lỗi này là WebDAV . Đảm bảo rằng bạn gỡ cài đặt nó.


Tôi đã vô hiệu hóa nó, nhưng nó không giúp ích gì
Bart

3
Vô hiệu hóa không có tác dụng, bạn phải hủy cài đặt nó.
John_

Tôi có thể xác nhận rằng vô hiệu hóa không giúp ích gì. @John_ có quyền đó, bạn phải gỡ cài đặt.
Mike L

7
câu trả lời của giacomelli dưới đây nên được đánh dấu là đúng cho câu hỏi này; đó là một giải pháp cục bộ không yêu cầu bạn gỡ cài đặt WebDav.
Joseph Woodward

1
@ B.ClayShannon WebDAV không phải là một chương trình độc lập, nó là một tính năng IIS. Vì vậy, tùy thuộc vào hệ điều hành của bạn, bạn phải tìm nó trong windows các tính năng / vai trò / dịch vụ vai trò / ... bất cứ thứ gì khác mà họ thấy tốt để phát minh ra để phân loại nó. Nhưng nếu thay đổi trong web.config không có gì khác biệt, điều đó có nghĩa là bạn vẫn gặp phải một vấn đề khác.
Frédéric

359

Bạn không cần gỡ cài đặt WebDAV, chỉ cần thêm những dòng này vào web.config:

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

1
Điều này đã hoạt động tốt. Người ta cần phải sử dụng tất cả chúng; bao gồm cả hai dòng "remove name = ...".
Chris Patterson

51
Đây phải là câu trả lời được chấp nhận imho, vì nó là một giải pháp cục bộ thay vì một giải pháp toàn cầu.
Marco Mp

3
điều này chỉ xuất hiện cho tôi trước một bản demo lớn vào sáng mai. bạn đã cứu mạng tôi.
Sonic Soul

27
"Bạn đã cứu mạng tôi theo đúng nghĩa đen" - Đột nhiên khách hàng của tôi có vẻ không tệ lắm.
Brandon gano

3
Câu trả lời xuất sắc. Tôi đồng ý rằng đây phải là câu trả lời được chấp nhận. Điều này khiến tôi cảm thấy tốt hơn nhiều so với việc gỡ cài đặt hoàn toàn WebDAV khỏi máy chủ web của chúng tôi.
mituw 16

17

Thay đổi tệp Web.Config của bạn như bên dưới

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<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>
</system.webServer>

Thêm WebDAV loại bỏ và WebDAVMODULE đã cho phép các chức năng PUT và DELETE. Cảm ơn.
Gfw

Nó hellped khi tôi thêm trên mã trong api tập tin webconfig dự án của tôi
Baqer Naqvi

15

Thay đổi tệp Web.Config của bạn như bên dưới. Nó sẽ hoạt động giống như sự quyến rũ.

Trong nút, <system.webServer>thêm phần bên dưới của mã

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

Sau khi thêm, Web.Config của bạn sẽ giống như bên dưới

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <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>

Bạn không nên trả lại * cho Allow-Origin. Xem stackoverflow.com/a/12014554
Karlas

@Karlas, vui lòng đọc câu hỏi trước khi đặt bình luận và bỏ phiếu. Câu hỏi không được hỏi cho "Allow-Origin" mà nó được yêu cầu xử lý cho các động từ http.
Santosh Prasad Sah

3
Tôi không phản đối, chỉ là một bình luận phụ, trong trường hợp ai đó sao chép giải pháp.
Karlas

Cảm ơn! runAllManagedModulesForAllRequests = "true" là những gì đã làm cho tôi.
Eddie Fletcher

9

Tôi gặp sự cố này và tôi đã giải quyết được những điều sau:

  1. mở IIS
  2. Chọn trang web phụ trợ

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

  3. trong chế độ xem tính năng: mở Bản đồ xử lý

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

  1. trong cửa sổ Bản đồ xử lý, Tìm WebDAV

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

  1. trong Chỉnh sửa ánh xạ mô-đun, mở Giới hạn yêu cầu

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

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

Cứu cuộc đời tôi. Cảm ơn
deanwilliammills

1
Điều này đã không hoạt động. Nó đã phá vỡ toàn bộ trang .Net CORE. Đã phải hoàn nguyên.
Ravi Ram

4

Nếu không có giải pháp nào ở trên giải quyết được sự cố của bạn như trong trường hợp của tôi (vẫn bị mắc kẹt với mô-đun RestClient của tôi đối mặt với 405), hãy thử yêu cầu Api của bạn bằng một công cụ như Postman hoặc Fiddler. Ý tôi là vấn đề có thể nằm ở chỗ khác như một yêu cầu có định dạng sai.

Tôi phát hiện ra rằng mô-đun RestClient của tôi đang yêu cầu 'Đặt' với một đồng hồ đo Id không được định dạng tốt:

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

thay vì

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

Ngẫu nhiên, yêu cầu có định dạng sai trả về 405 - Phương pháp không được phép (IIS 7.5)


Tôi cũng gặp trường hợp tương tự ở đây. Tuy nhiên, trong trường hợp của tôi, tôi phải chuyển một cơ thể với yêu cầu PUT của mình. Tôi đang sử dụng Người mất ngủ (giống như Người đưa thư) như một công cụ khách hàng và nó hoạt động rất tốt. Nhưng không phải trên mã của tôi. Bất kỳ ý tưởng?
Darós

3

Không phổ biến nhưng có thể giúp một số.

đảm bảo rằng bạn đang sử dụng [HttpPut] từ System.Web.Http

Chúng tôi đã nhận được 'Phương pháp không được phép' 405, trên một phương pháp được trang trí HttpPut.

Sự cố của chúng tôi dường như không phổ biến, vì chúng tôi đã vô tình sử dụng thuộc tính [HttpPut] từ System.Web.Mvc chứ không phải System.Web.Http

Lý do là, resharper đề xuất phiên bản .Mvc, trong đó thường là System.Web.Http đã được tham chiếu khi bạn lấy trực tiếp từ ApiController, chúng tôi đang sử dụng một lớp mở rộng ApiController.


1
Nếu bạn đang sử dụng API Web, bạn hoàn toàn không trang trí các phương thức bộ điều khiển - nhưng hãy sử dụng động từ trong tên phương thức.
niico

2

Tôi đã từng xảy ra điều này (phương thức 405 không được phép) khi phương thức đăng api web mà tôi đang gọi có kiểu nguyên thủy cho các tham số, thay vì kiểu phức tạp được truy cập từ phần thân. Như vậy:

Điều này đã hoạt động:

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

Điều này không:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)

1
Điều này cũng có thể xảy ra nếu có sự không khớp giữa tham số trong tuyến và tên biến trong chữ ký phương thức (Nói cách khác route = "/ api / person / {ID}" và method = "public void putPerson (int id) {...} ")
RonnBlack

2

Lỗi này đến từ trình xử lý staticfile - theo mặc định không lọc bất kỳ động từ nào, nhưng có lẽ chỉ có thể xử lý với HEAD và GET.

Và điều này là do không có người xử lý nào khác bước lên đĩa và nói rằng họ có thể xử lý XÓA.

Vì bạn đang sử dụng WEBAPI, do định tuyến không có tệp và do đó có phần mở rộng, nên bạn cần thêm các phần bổ sung sau vào tệp web.config của bạn:

<system.webserver>
    <httpProtocol>
        <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="C:\windows\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="C:\windows\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" />

Rõ ràng là cần thiết phụ thuộc vào chế độ cổ điển và chế độ tích hợp, và chế độ cổ điển phụ thuộc vào bitness. Ngoài ra, tiêu đề OPTIONS đã được thêm vào để xử lý CORS, nhưng nếu bạn không làm CORS, bạn không cần điều đó.

FYI, web.config của bạn là phiên bản cục bộ của ứng dụng (hoặc thư mục ứng dụng) có cấp cao nhất là applicationHost.config.


1

Nếu là IIS 8.0, hãy kiểm tra xem Kích hoạt HTTP đã được bật chưa. Trình quản lý máy chủ -> IIS -> Quản lý (xem trên cùng bên phải) -> Thêm Vai trò và Tính năng -> ... -> truy cập cấu hình WCF và sau đó chọn Kích hoạt HTTP.


0

Trong trường hợp của chúng tôi, vấn đề là với dấu hiệu liên kết giữa trang web .Net và ADFS. Khi chuyển hướng đến ADFS Endpoint các wctxthông số cần thiết cả ba tham số cho WSFederationAuthenticationModule.CreateSignInRequestphương pháp: rm, id, vàru

Cảm ơn Guillaume Raymond về mẹo kiểm tra thông số URL!


0

Bên cạnh tất cả các giải pháp trên, hãy kiểm tra xem bạn có " id" hoặc bất kỳ tham số được xác định tùy chỉnh nào trong DELETEphương thức phù hợp với cấu hình tuyến không.

public void Delete(int id)
{
    //some code here
}

Nếu bạn gặp phải lỗi 405 lặp lại, tốt hơn hãy đặt lại chữ ký phương thức về mặc định như trên và thử.

Cấu hình tuyến theo mặc định sẽ tìm kiếm idtrong URL. Vì vậy, tên tham số idlà quan trọng ở đây trừ khi bạn thay đổi cấu hình tuyến trongApp_Start thư mục.

Bạn có thể thay đổi kiểu dữ liệu của idmặc dù.

Ví dụ, phương pháp dưới đây sẽ hoạt động tốt:

public void Delete(string id)
{
    //some code here
}

Lưu ý: Cũng đảm bảo rằng bạn chuyển dữ liệu qua url không phải là phương thức dữ liệu sẽ mang trọng tải dưới dạng nội dung cơ thể.

DELETE http://{url}/{action}/{id}

Thí dụ:

DELETE http://localhost/item/1

Hy vọng nó giúp.


0

Tôi sẽ thêm cho những người gặp khó khăn khi cố gắng chạy PHP( Laraveltrong trường hợp có thể) hoặc IIStình huống lưu trữ duy nhất khác với 405 error, rằng bạn cần thay đổi verbstrình xử lý cho điều đó cho tình huống cụ thể đó ... vì vậy vì tôi đang sử dụng, PHPtôi đã trình PHPxử lý và trong tab, Request Restrictionssau đó Verbs, hãy thêm những thứ verbsbạn cần. Đây là tất cả những gì cần thiết để thêm vào web.configđể cho phép CORStrong Laravel.

<handlers>
  <remove name="php-5.6.40" />
  <add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>

0

Không có cách nào ở trên phù hợp với tôi và tôi đã gặp sự cố khi sử dụng trang hỗ trợ ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website -that-is-host-on-a-server) sau đó tôi so sánh tệp máy chủ ứng dụng với một trong các bản sao đang hoạt động và có vẻ như tôi đã thiếu một loạt trình xử lý và khi tôi thêm lại chúng vào máy chủ ứng dụng thì nó bắt đầu hoạt động. Tôi đã thiếu tất cả những thứ này,

<add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
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.