2014-05-06 15 views
16

Tôi có dự án API Web và tôi không thể bật yêu cầu "PUT/Patch".API Web - 405 - Tài nguyên được yêu cầu không hỗ trợ phương thức http 'PUT'

Câu trả lời tôi nhận được từ cáy là:


HTTP/1.1 405 Method Not Allowed 
Cache-Control: no-cache 
Pragma: no-cache 
Allow: GET,POST,DELETE 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcZG90TmV0XFdlYkFQSVxBZFNlcnZpY2VcQWRTZXJ2aWNlXGFwaVxpbXByZXNzaW9uXDE1?= 
X-Powered-By: ASP.NET 
Date: Tue, 06 May 2014 14:10:35 GMT 
Content-Length: 72 

{"message":"The requested resource does not support http method 'PUT'."} 

Dựa trên những phản ứng trên, "PUT" động từ không được chấp nhận. Tuy nhiên, tôi không thể tìm ra nơi xử lý liên quan được cấu hình.

Các "Đặt" phương pháp của lớp được khai báo như sau:

[HttpPatch] 
[HttpPut] 
public HttpResponseMessage Put(Int32 aID, [FromBody] ImpressionModel impressionModel) 
{ 
    bla, bla, bla, bla 
} 

Tôi đã đọc và thực hiện những thay đổi được giải thích trong bài sau đây: - Asp.NET Web API - 405 - HTTP verb used to access this page is not allowed - how to set handler mappings - http://www.asp.net/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications

Không có gì đã làm việc như Tôi vẫn nhận được một phản ứng 405 khi cố gắng phát hành một lệnh "PUT" chống lại dự án Web API của tôi.

Tôi thậm chí còn nhận xét tất cả "Trình xử lý" trong tệp ApplicationsHost.config.

Làm việc với VS2012 Premium và IIS Express (Tôi giả định là phiên bản 8). Tôi cũng đã thử VS Dev Server nhưng điều đó cũng cho tôi kết quả tương tự.

Tôi hết ý tưởng. Bất kỳ trợ giúp sẽ được đánh giá cao.

Cảm ơn Lee

Trả lời

0

Bạn nên định cấu hình trong cấu hình máy chủ web của mình. Nó phụ thuộc vào loại máy chủ web, nơi bạn có thể làm điều đó. Ví dụ bằng IIS, bạn có thể sử dụng tệp web.config để làm điều đó trong thư mục gốc của tài liệu. Với các yêu cầu có nguồn gốc chéo, bạn phải thêm tiêu đề CORS vào phản hồi, để cho phép xuất xứ, phương pháp, v.v.

lưu ý: Có lẽ bạn cũng có thể làm điều gì đó với khung ASP.NET, nhưng tôi nghĩ rằng nó không giống như vậy.

0

Thêm phần sau đây theo phần Handler trong web.config:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

Ví dụ:

<handlers> 
    <remove name="WebDAV" /> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
</handlers> 
20

Bạn đang sử dụng thuộc tính định tuyến?

Lỗi thần bí này là thuộc tính tuyến đường vấn đề. Đây được kích hoạt trong WebAPIConfig của bạn như:

config.MapHttpAttributeRoutes(); 

Hóa ra điều khiển Web Api "không thể tổ chức một hỗn hợp của phương pháp hành động động từ dựa trên truyền thống và tên hành động định tuyến."; https://aspnetwebstack.codeplex.com/workitem/184

trong một nutshell: tôi cần phải đánh dấu tất cả các hành động của tôi trong bộ điều khiển API của tôi với [Route] thuộc tính, nếu không hành động là "ẩn" (405'd) khi cố gắng xác định vị trí nó thông qua định tuyến truyền thống.

điều khiển API:

[RoutePrefix("api/quotes")] 
public class QuotesController : ApiController 
{ 
    ... 

    // POST api/Quote 
    [ResponseType(typeof(Quote))] 
    [Route] 
    public IHttpActionResult PostQuote(Quote quote) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     db.Quotes.Add(quote); 
     db.SaveChanges(); 

     return CreatedAtRoute("", new { id = quote.QuoteId }, quote); 
    } 

lưu ý: Route của tôi là vô danh nên tên CreatedAtRoute() chỉ là một chuỗi rỗng.

WebApiConfig.cs:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

    } 
} 

hy vọng điều này giúp

+0

không may cho tôi nữa. đó là vấn đề tương tự. –

+0

+1 để cung cấp liên kết đến sự cố được báo cáo trong CodePlex. Ngoài ra, bạn có thể tìm thấy 2 liên kết khác nhau để giải quyết sự cố. Vì vấn đề đã bị đóng mà không có sự sửa chữa, tôi muốn quản lý nó mà không có bất kỳ giải pháp nào khác để tránh làm kỹ hơn API Web của tôi;) –

+0

Cảm ơn bạn! Thêm [Route] vào PUT và POST (nó bị thiếu) đã giải quyết được vấn đề của tôi. Cuối cùng, thông tin quan trọng về định tuyến api trên web! – ticky

7

tôi đã có vấn đề chính xác giống như bạn, và tôi đã cố gắng tất cả những điều bạn đã cố gắng nhưng đôi khi giải pháp là rất tầm thường và dưới của bạn mũi, rằng bạn chỉ không mong đợi nó và tiếp tục tìm kiếm lý do phức tạp hơn. Đảm bảo rằng trong url bạn đang gọi để kiểm tra phương pháp web của bạn, tên param khớp với tên trong khai báo phương pháp điều khiển của bạn. Vấn đề của tôi 405 đã được giải quyết bằng cách đơn giản làm điều này (tôi đã sử dụng params truy vấn):

clientsController của tôi:

... 

[HttpPut] 
public string PutClient(string username = "", string phone= ""){...} 

On WebApiConfig tôi:

// Web API routes 
config.MapHttpAttributeRoutes(); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}" 
); 

Và con đường sử dụng để thử nghiệm phương pháp này phải giống như vậy: (sử dụng Người đưa thư hoặc tương tự, để áp dụng đúng phương pháp web)

http://localhost:49216/api/clients?username=Kurt&phone=443332211 

Otherw ise, bạn sẽ nhận được 405 cho phương thức http đó trong bộ điều khiển đó. Tôi không cần phải thay đổi web.config ở tất cả (không cần phải loại bỏ webdav, vv ..). Kiểm tra this cho nguồn trong tài liệu:

Ví dụ, hãy xem xét các hành động sau đây:

public void Nhận (int id)

Các tham số id liên kết với các URI. Do đó, hành động này chỉ có thể khớp với URI chứa giá trị cho "id", hoặc trong từ điển tuyến đường hoặc trong chuỗi truy vấn.

Thông số tùy chọn là ngoại lệ, vì chúng là tùy chọn. Đối với một tham số tùy chọn, không sao nếu liên kết không thể nhận giá trị từ URI.

+0

Tương tự ở đây. Đã đi qua tên param sai và gãi đầu của tôi trong một giờ !! –

1

Đây cũng là thông báo lỗi được trả lại nếu bạn quên đặt phương thức Put() trên bộ điều khiển API của bạn ở chế độ công khai. Điều này rõ ràng là khó hiểu, nhưng đã khiến tôi mất mười phút đầu trầy xước.

1

có cùng một vấn đề, tôi cần phải làm 3 điều để giải quyết này:

  1. vô hiệu hóa WebDAV trong <modules><handlers>
  2. Hãy chắc chắn rằng HttpPut là từ System.Web.Http và không phải từ hệ thống. Web.MVC khi sử dụng WebAPI
  3. phép ExtensionlessUrlHandler như thế này

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

Hy vọng điều này có thể giúp một số bạn để giải quyết vấn đề khó chịu này ...

2

Câu trả lời này cố định vấn đề đối với tôi. Tôi đã phải thêm thuộc tính Route và vấn đề đã được giải quyết.

[HttpPut] 
    [Route("")] 
    public HttpResponseMessage MyMethod() 
1

Điều này xảy ra với tôi khi tôi đã thay đổi tên tham số đầu tiên của phương pháp PUT

public void Put(int code, [FromBody]Lead lead) 

Nó nên là:

public void Put(int id, [FromBody]Lead lead) 

Và đây là cách nó được gọi là:

$.ajax({ 
    type: "PUT", 
    data: json, 
    url: "../api/leadsapi/123", 
    contentType: "application/json; charset=utf-8" 
}); 
Các vấn đề liên quan