2012-04-11 34 views
28

(bài đường chuyền từ Server Fault. Tôi nhận ra sau đó mà tôi có lẽ đã hỏi về stackoverflow đầu tiên)ASP.NET Web API trả về 404 cho PUT chỉ trên một số máy chủ

Ok, tôi đã làm đau đớn não của tôi và internet cho một giải pháp cho điều này. Tôi không thể hiểu được.

Tôi đã viết một trang web sử dụng ASP.NET MVC Web API và tất cả hoạt động độc đáo cho đến khi tôi đặt nó trên máy chủ dàn dựng. Trang web hoạt động tốt trên máy cục bộ của tôi và máy chủ web dev. Cả hai máy chủ dev và dàn dựng đều là Win Server 2008 R2.

Vấn đề là: về cơ bản trang web hoạt động, nhưng có một số lệnh gọi API sử dụng phương pháp HTTP PUT. Những thất bại trên dàn dựng trở lại một 404, nhưng làm việc tốt ở nơi khác.

Vấn đề đầu tiên mà tôi gặp phải và khắc phục là trong Yêu cầu lọc. Nhưng vẫn nhận được 404.

Tôi đã bật truy tìm trong IIS và gặp sự cố sau.

168. -MODULE_SET_RESPONSE_ERROR_STATUS 
ModuleName IIS Web Core 
Notification 16 
HttpStatus 404 
HttpReason Not Found 
HttpSubStatus 0 
ErrorCode 2147942402 
ConfigExceptionInfo 
Notification MAP_REQUEST_HANDLER 
ErrorCode The system cannot find the file specified. (0x80070002) 

Các cấu hình giống nhau trên bản vẽ và dàn dựng, thực tế toàn bộ trang web là bản sao trực tiếp.

Tại sao GET và POST hoạt động, chứ không phải PUT?

Cảm ơn

Greg

+0

Đã trả lời giúp đỡ của tôi? Bạn đã thử à? – Aliostad

+0

Có nó đã làm việc, cảm ơn bạn. –

Trả lời

25

Những máy chủ IIS có mô-đun web DAV cài đặt trên họ và tôi đặt cược nó không phải là cần thiết và nó đã được cài đặt bởi vì người đó Việc cài đặt đánh dấu tất cả các ô.

Chỉ cần xóa web-dav khỏi iis.

Hoặc sử dụng web.config để loại bỏ mô-đun web DAV:

<system.webServer> 
    <modules> 
     <remove name="WebDAVModule" /> 
    </modules> 
    ... 
+1

Cảm ơn, tôi đã sử dụng tùy chọn cấu hình và đã hoạt động. –

+1

Đôi khi WebDAV là thủ phạm cho các vấn đề PUT tuy nhiên thực tế là vấn đề này là WebApi cụ thể (sử dụng trình xử lý url vô hạn), tôi khuyên mọi người hãy thử câu trả lời của Kevin Ortman trước. –

44

Đối với những người bạn của những người không có WebDAV kích hoạt nhưng vẫn chạy vào vấn đề này sử dụng MVC 4 của Web API của ...

Steve Michelotti ghi lại một giải pháp làm việc cho tôi here.

Vào cuối ngày, tôi đã bật tất cả các động từ (verb = "*") cho trình xử lý ExtensionlessUrlHandler-Integrated-4.0 trong cấu hình web của tôi.

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true" /> 
     <handlers> 
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" /> 
     </handlers> 
</system.webServer> 
+0

Điều này đã giải quyết http://stackoverflow.com/questions/11257749/attributerouting-why-is-my-post-but-not-my-put-routed cho tôi (câu hỏi hóa ra là một bản sao của câu hỏi này). – Halvard

+0

Làm việc cho tôi chỉ với phần . Lưu ý rằng runAllManagedModulesForAllRequests nên tránh, và ở đây nó không có vẻ cần thiết. –

+1

Điều này -> là những gì làm cho mọi thứ hoạt động. Nó yêu cầu IIS bỏ qua bộ "preConditions" trong các trình xử lý. – dotnetster

5

Nhà cung cấp lưu trữ của tôi KHÔNG thể gỡ cài đặt WebDAV vì điều này sẽ ảnh hưởng đến mọi người.

Điều này, runAllManagedModulesForAllRequests = "true", đã hoạt động nhưng không được khuyến nghị.

Nhiều bản sửa lỗi bao gồm xóa mô-đun cho WebDAVModule nhưng vẫn không hoạt động. Tôi cũng gỡ bỏ trình xử lý và cuối cùng tôi có thể sử dụng tất cả các động từ POST GET PUT DELETE.

Xóa WebDAVModule và WebDAV trong các mô-đun và trình xử lý.

<modules> 
    <remove name="WebDAVModule" /> 
</modules> 
<handlers> 
    <remove name="WebDAV" /> 
</handlers> 
+0

điều này cuối cùng đã giải quyết vấn đề của tôi, không có gì khác. – CularBytes

1

Rick Strahl từ Tây-Gió đề nghị như sau:

 
    < handlers> 
    < remove name="ExtensionlessUrlHandler-Integrated-4.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> 
mà làm việc rất tốt cho tôi.

0

Tôi đã giải quyết vấn đề này bằng cách thay đổi nhóm ứng dụng của tôi cho trang web thành Chế độ tích hợp khi chế độ này trước đây ở chế độ Cổ điển.

+0

trong trường hợp bạn đang sử dụng phần mềm trung gian OWIN và lưu trữ trên IIS thì vấn đề có thể là do OWIN chỉ hỗ trợ chế độ tích hợp – Jordan

4

tôi cố định này loại bỏ các ISAPI filter UrlScan

4

Trong trường hợp của tôi, không ai trong số các giải pháp này được áp dụng.

Tôi đã sửa lỗi bằng cách thay đổi nhóm ứng dụng của mình thành Tích hợp thay vì Cổ điển.

Việc xử lý:

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

sẽ không làm việc với một hồ bơi ứng dụng cổ điển, kể từ preCondition của nó là integratedMode.

10

Dường như có một số lý do khiến điều này xảy ra. Không có điều nào ở trên khá hiệu quả đối với tôi. Tôi đã có các thiết lập ExtensionlessUrlHandler trong web.config với tất cả các động từ HTTP cần thiết. Cuối cùng tôi đã phải thực hiện những thay đổi sau trong IIS:

  • trong IIS chọn trang web của bạn và nhấp đúp vào Handler Mappings
  • Tìm ExtensionlessUrlHandler-ISAPI-4.0_32bit và nhấp đúp vào
  • Trong hộp thoại xuất hiện, nhấp Request Restrictions
  • trên tab verbs thêm các động từ HTTP thiếu nhau bằng dấu phẩy (trong trường hợp của tôi nó đã PUTDELETE
  • Bấm Ok nơi yêu cầu và trả lời Yes trong hộp thoại Edit Script Map bật lên.
  • Lặp lại cho ExtensionlessUrlHandler-ISAPI-4.0_64bit

Hope this helps ai đó :)

+0

Vô cùng hữu ích! Điều này nên được kiểm tra đầu tiên. – brhardwick

Các vấn đề liên quan