WebAPI Xóa không hoạt động - Phương pháp 405 Không được phép


120

Tôi đánh giá cao bất kỳ sự giúp đỡ nào về vấn đề này vì trang web được cho là sẽ hoạt động vào tối nay!

Tôi có bộ điều khiển api web với phương pháp Xóa. Phương pháp này thực thi tốt trên máy cục bộ của tôi đang chạy IIS Express (Windows 8) nhưng ngay sau khi tôi triển khai nó lên máy chủ IIS trực tiếp (Windows Server 2008 R2), nó đã ngừng hoạt động và đưa ra thông báo lỗi sau:

Lỗi HTTP 405.0 - Phương pháp Không được phép Không thể hiển thị trang bạn đang tìm vì một phương thức không hợp lệ (Động từ HTTP) đang được sử dụng

Tôi đã tìm kiếm các giải pháp trên web và tôi đã triển khai những giải pháp hợp lý nhất. Cấu hình web của tôi có các cài đặt sau:

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

Tôi cũng đã cố gắng thay đổi Ánh xạ xử lý và Lọc yêu cầu trong IIS nhưng không có kết quả. Xin lưu ý rằng Quy tắc tác giả WebDAV trong IIS dường như đã bị vô hiệu hóa.

Bất kỳ ý tưởng sẽ được đánh giá rất cao Cảm ơn.

Câu trả lời:


199

Tôi đã tìm thấy giải pháp cuối cùng! Nếu bạn gặp vấn đề tương tự, hãy thêm phần sau vào web.config của bạn

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

Tôi hi vọng cái này giúp được


2
Tôi cũng đã có thêm một loại bỏ trong phần xử lý theo stackoverflow.com/a/6698096/254156
RRRR

3
Cũng đã từng làm việc ở đây. Nhưng ai đó có thể giải thích cho tôi mối quan hệ với WebDAVModule không?
Boas Enkler

11
đối với những người chỉ copy-paste: runAllManagedModulesForAllRequests = "true" không thực sự cần thiết và thực sự có thể phá vỡ những thứ khác.
Zar Shardan

Một số bài viết trên web khác sẽ đề nghị loại bỏ các mô-đun sử dụng phần IIS Modules, vô hiệu hóa này nó nhưng nó vẫn gây ra này / một vấn đề tương tự, đây là phương pháp đáng tin cậy nhất
Anthony chính

4
@ZarShardan (và những người khác) FYI: Nếu bạn xóa thuộc tính runAllManagedModulesForAllRequests = "true", bạn cũng sẽ cần thêm <remove name = "WebDAV" /> bên dưới nút <handlers>.
Aaron

65

Trong một số trường hợp, chỉ xóa nó khỏi mô-đun có thể tạo ra lỗi tiếp theo:

500.21 Trình xử lý "WebDAV" có mô-đun không hợp lệ "WebDAVModule" trong danh sách mô-đun của nó

Mô-đun: IIS Web Core Notification: ExecuteRequestHandler "

giải pháp đã được đề xuất ở đây . Cũng cần xóa nó khỏi trình xử lý.

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

1
điều này phù hợp với tôi, nhưng ai đó có thể làm sáng tỏ thực sự WebDAV là gì không?
Nazrul Muhaimin

31

Trong trường hợp của tôi, không có giải pháp nào ở trên hoạt động. Điều này là do tôi đã thay đổi tên của tham số trongDelete phương thức .

Tôi đã có

public void Delete(string Questionid)

thay vì

public void Delete(string id)

Tôi cần sử dụng idtên vì đó là tên được khai báo trong WebApiConfigtệp của tôi . Lưu ý idtên ở dòng thứ ba và thứ tư:

            config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

Tôi nhận được giải pháp này từ đây .


15

Javascript cho DELETEđộng từ HTTP phải như sau:

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

Đừng không sử dụng một cái gì đó như thế này:

...
data: {id:id}
...

như khi bạn sử dụng POSTphương pháp này.


1
Xin chào @Pavel, điều này đúng nếu bạn thực sự đang sử dụng triển khai RESTful đầy đủ. Thật không may, không phải ai cũng làm điều này và khá phổ biến khi thấy các nhà phát triển sử dụng ĐĂNG thay vì XÓA, v.v. Cảm ơn bạn đã làm rõ điều này.
Chris

5

Sau khi thử hầu hết mọi giải pháp ở đây, điều này đã làm việc cho tôi. Thêm cái này vào tệp cấu hình API của bạn

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

Đã thử rất nhiều thứ, điều này đã hiệu quả. Phiên bản .NET 4.6.1 - Cảm ơn.
Ketan

4

Nếu bạn đang sử dụng phiên bản IIS 7.0 trở lên. Sự cố này chủ yếu liên quan đến mô-đun mở rộng WebDAV trên máy chủ IIS. điều này đã xảy ra trong khi Sử dụng hành động Đăng HOẶC xóa.

Vui lòng thử cài đặt bên dưới trong cấu hình web

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

3

Tôi cũng gặp sự cố tương tự, tôi đang gọi WebAPi và gặp lỗi này. Thêm cấu hình sau vào web.config cho các dịch vụ đã giải quyết được sự cố của tôi

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

trong tệp web.config đã giải quyết được vấn đề của tôi. Đây là cách tôi đã gọi từ phía khách hàng

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

Truy cập tệp applicationHost.config (thường trong C: \ Windows \ System32 \ inetsrv \ config) và nhận xét dòng sau trong applicationHost.config

1) Dưới <người xử lý>:

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

2) Cũng bình luận về mô-đun sau được trình xử lý ở trên giới thiệu dưới <mô-đun>

<add name="WebDAVModule" />

Hoặc sử dụng câu trả lời khác stackoverflow.com/a/47907578/1754743 để XÓA các trình xử lý này trong web.config của riêng bạn, nếu bạn không muốn (hoặc không thể) sửa đổi tệp cấu hình toàn máy
Ekus

2

Trong trường hợp của tôi, tôi đã bỏ lỡ thêm {id}vào [Route("")]và tôi gặp lỗi tương tự. Thêm điều đó đã khắc phục sự cố cho tôi:[Route("{id}")]


Vì vậy, nhiều giờ thời gian lãng phí, và nếu nó không được cho bạn tôi vẫn không thể giải quyết việc này .... Tôi tự hỏi tại sao nó không trả lại 404: @
deadManN

1

Tôi gặp lỗi 405 Phương pháp Không được phép vì tôi đã bỏ qua để đặt phương thức Xóa trên bộ điều khiển WebApi ở chế độ công khai.

Tôi đã mất nhiều thời gian để tìm thấy điều này (quá lâu!) Bởi vì tôi có thể mong đợi lỗi Không tìm thấy trong trường hợp này, vì vậy tôi đã giả định sai rằng phương pháp Xóa của tôi đang bị từ chối.

Lý do cho Không được phép chứ không phải Không tìm thấy là tôi cũng có một phương thức Nhận cho cùng một tuyến (đây sẽ là trường hợp bình thường khi triển khai REST). Chức năng Nhận công khai được khớp bởi định tuyến và sau đó bị từ chối do phương thức http sai.

Một lỗi đơn giản tôi biết nhưng nó có thể tiết kiệm thời gian cho người khác.


1

Chỉ để thêm. Nếu đây là cấu hình của bạn

config.Routes.MapHttpRoute (
            tên: "DefaultApi",
            routeTemplate: "api / {controller} / {id}",
            mặc định: new {id = RouteParameter.Optional}

vui lòng tiếp tục làm như Hugo đã nói và không đặt thuộc tính Route cho phương thức nhận bộ điều khiển, điều này đã gây ra một vấn đề trong trường hợp của tôi.


0

Tôi đã gặp vấn đề tương tự nhưng đối với PUT - không có đề xuất nào khác phù hợp với tôi.

Tuy nhiên, tôi đang sử dụng intthay vì sử dụng mặc định stringcho id. thêm {id:int}vào tuyến đường đã giải quyết được vấn đề của tôi.

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

0

Chúng tôi đã phải thêm các tiêu đề tùy chỉnh vào web.config của mình vì yêu cầu của chúng tôi có nhiều tiêu đề gây nhầm lẫn cho phản hồi API.

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

-1

Thuộc tính [HttpPost] ở đầu phương thức Xóa đã giải quyết vấn đề này cho tôi:

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

Đó có thể là một lý do tại sao nó hoạt động cho bạn. Tôi đã sử dụng phiên bản cũ hơn, vào khoảng đầu năm 2013, vì vậy, khá nhiều thứ đã được sửa kể từ đó. Rất vui khi biết nó có hiệu quả với bạn.
Chris

4
Thành thật mà nói, đây không phải là một câu trả lời hay. Những người có vấn đề đã được giải quyết bằng này đang sử dụng POST thay vì DELETE để nó không thể và không nên làm việc
Alexander Derck

Tôi tin rằng điều này là do bạn đang sử dụng data(tức là nội dung của yêu cầu) thay vì params(tức là url của yêu cầu) ở phía máy khách.
Thomas Sauvajon

Tôi đồng ý với Alexander Derck, đây là một vấn đề khó khăn hơn là một giải pháp.
Basem Sayej
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.