ASP.NET Web API - ไม่สามารถใช้คำกริยา PUT & DELETE - IIS 8


145

ฉันเพิ่งอัพเกรดจาก Visual Studio 2010 เป็น Visual Studio 2012 RC โปรแกรมติดตั้งยังติดตั้ง IIS 8 Express ซึ่งขณะนี้ Visual Studio ใช้เป็นเว็บเซิร์ฟเวอร์เริ่มต้น

IIS 8 กำลังบล็อกการร้องขอ WEB API ของฉันที่ใช้คำกริยา PUT และ DELETE IIS ส่งกลับข้อผิดพลาด The requested resource does not support http method 'PUT'405

ฉันรู้ว่าผู้คนมีปัญหากับเรื่องนี้ในอดีตและมีข้อความหลายข้อความเกี่ยวกับเรื่อง Stack Overflow ด้วย IIS 7 Express วิธีแก้ไขคือถอนการติดตั้ง WebDav น่าเสียดายที่ฉันไม่เห็นวิธีการทำเช่นนั้นกับ IIS 8

ฉันได้ลองแก้ไขส่วน WebDav จาก applicationhost.config แล้วแต่ไม่ได้ช่วยอะไร ตัวอย่างเช่นฉันลบออก<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />จากไฟล์กำหนดค่า

ฉันใช้เวลากับสิ่งนี้มานานเกินไป จะต้องมีวิธีง่ายๆในการเปิดใช้งาน PUT และ DELETE หรือไม่


สิ่งนี้ยังขาดอยู่ในเวอร์ชัน RTM เพียงแค่สูญเสียไป 3 ชั่วโมงในวันนี้ ... ExtensionlessUrl-Integrated-4.0สิ่งที่เขาต้องการก็คือการเพิ่มคำกริยาพิเศษเพื่อ
leppie

1
ฉันไม่คิดว่ามันจะพัง แต่เป็นการออกแบบ ฉันคิดว่าการเปลี่ยนพฤติกรรมเริ่มต้นจะรบกวน WebDAV และทำลายความเข้ากันได้ย้อนหลัง สิ่งนี้ยังไม่ทำงานกับ IIS7 เมื่อติดตั้ง WebDAV
ทำเครื่องหมาย

ฉันเพิ่งเสียเวลา 3 ชั่วโมงกับเรื่องนี้ ... 6 ปีหลังจากโพสต์นี้
Brian Jenkins

คำตอบ:


162

ตกลง. ในที่สุดฉันก็มาถึงจุดต่ำสุดของเรื่องนี้ คุณต้องข้ามบางห่วงเพื่อให้กริยา PUT และ DELETE ทำงานอย่างถูกต้องกับ IIS8 ในความเป็นจริงถ้าคุณติดตั้งตัวเลือกการเปิดตัวของ VS 2012 และสร้างโครงการ WEB API ใหม่คุณจะพบว่าวิธีการตัวอย่าง PUT และ DELETE ส่งคืนข้อผิดพลาด 404 ออกจากกล่อง

ในการใช้คำกริยา PUT และ DELETE กับ Web API คุณต้องแก้ไข% userprofile% \ document \ iisexpress \ config \ applicationhost.config และเพิ่มคำกริยาให้กับตัวจัดการ ExtensionlessUrl ดังนี้:

เปลี่ยนบรรทัดนี้:

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

ถึง:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

นอกเหนือจากข้างต้นคุณควรตรวจสอบให้แน่ใจว่า WebDAV ไม่รบกวนคำขอของคุณ ซึ่งสามารถทำได้โดยการใส่เครื่องหมายความคิดเห็นในบรรทัดต่อไปนี้จาก applicationhost.config

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" /> 
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

นอกจากนี้โปรดทราบว่าการประชุม Web API เริ่มต้นคือชื่อวิธีการของคุณควรตรงกับกริยา HTTP ที่เรียกใช้ ตัวอย่างเช่นหากคุณกำลังส่ง HTTP delete ให้ร้องขอวิธีการของคุณตามค่าเริ่มต้นควรตั้งชื่อ Delete


9
สำหรับปัญหาที่คล้ายกันกับ OPTIONS verb บน IIS8 (ที่มีสิ่งอื่นขัดขวางก่อนที่ตัวจัดการของคุณ) ลอง <remove name = "OPTIONSVerbHandler" /> ใน web.config ของคุณ สำหรับเรื่องที่ผมจะแนะนำให้ใช้ "ลบ" เทคนิคใน web.config ท้องถิ่นของคุณมากกว่า messing กับ ApplicationHost.config เมื่อเป็นไปตามกฎทั่วไป
เจสัน

7
แทนที่จะลบ WebDAV ที่ระดับเซิร์ฟเวอร์ซึ่งอาจมีผลกระทบแบบเคาะมันจะดีกว่าที่จะลบออกจากโครงการของคุณตามที่แสดงที่นี่: stackoverflow.com/a/14465655/428280
Twisted

แล้วไงต่อ? อาจเป็นไปได้ที่จะทำงานในพื้นที่ แต่จะไม่ทำงานบน Azure
Toolkit

3
คำตอบที่แนะนำให้แก้ไขการตั้งค่าระบบแม้กระทั่งบนเครื่อง dev ไม่สามารถเป็นคำตอบได้ วิธีนี้จะช่วยแก้อาการและไม่ได้ช่วยในทีมและในการผลิต คุณจะทำซ้ำสิ่งนี้ในทุกเครื่องหรือไม่? ตรวจสอบคำตอบของ Santosh Sah
André Werlang

นอกจากนี้ผมยังต้องเอาWebDAVModuleจากส่วนโมดูลตามคำตอบ Santosh เซ็กซี่ของ
Ivaylo Slavov

125

เปลี่ยนไฟล์ Web.Config ของคุณดังนี้ มันจะทำตัวเหมือนมีเสน่ห์

ในโหนด<system.webServer>เพิ่มส่วนของรหัสด้านล่าง

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

หลังจากเพิ่ม Web.Config ของคุณจะมีลักษณะดังนี้

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

3
การลบ WebDavModule เป็นวิธีที่ถูกต้องในการเรียกใช้ปัญหานี้
MissRaphie

6
บันทึกวันของฉัน: <modules runAllManagedModulesForAllRequests = "true"> <remove name = "WebDAVModule" /> </modules>
Peter Stegnar

3
ไม่จำเป็นต้องมีส่วนหัวที่กำหนดเองเนื่องจากพวกเขาเกี่ยวข้องกับ CORS และวิธีนี้ทำให้คุณสามารถเจาะรูช่องโหว่ได้ เพียงส่วนที่เกี่ยวข้องWebDAVModuleมีความเกี่ยวข้อง
André Werlang

2
คำตอบนี้ถูกต้องโดยมีข้อยกเว้นเพียงอย่างเดียวที่ชื่อตัวจัดการอาจแตกต่างกันไปตามรุ่นของ IIS - ตัวอย่างเช่น 7.5 ใช้"ExtensionlessUrlHandler-Integrated-4.0"(ตามคำตอบข้างต้น) ในขณะที่ IIS 8.5 ได้เปลี่ยนชื่อนี้เป็น"ExtensionlessUrl-Integrated-4.0"(กล่าวถึงโดยMark Sชื่อของตัวจัดการจะแสดงด้วย ใน IIS หน้าข้อผิดพลาดเมื่อคุณได้รับข้อผิดพลาดดังนั้นจึงควรจะเล็ก ๆ น้อย ๆ ที่จะทราบว่าชุดผมใช้ทั้งสองชื่อเพื่อรองรับสภาพแวดล้อมการโฮสต์ที่แตกต่างกัน..
โอโบ Slavov

7
มันทำให้ฉันตายเล็กน้อยภายในทุกครั้งที่ฉันเห็นสิ่งนี้ - runAllManagedModulesForAllRequests = "true" - เป็นวิธีการแก้ปัญหาbritishdeveloper.co.uk/2010/06/ …
Oliver

61

ลบWebDAV ที่เหมาะสำหรับกรณีของฉัน:

<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  <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>

มันจะดีกว่าเสมอในการแก้ปัญหาผ่าน web.config แทนที่จะไปแก้ไขมันผ่าน iis หรือ machine.config เพื่อให้สิทธิ์มันจะไม่เกิดขึ้นหากแอปที่โฮสต์ที่เครื่องอื่น


สิ่งนี้ใช้ได้กับฉันซึ่งคนอื่นไม่ได้ด้วยเหตุผลบางอย่าง (อยู่ใน IIS 8.5) ขอบคุณ
John

4
ลบ WebDAVModule ใช้งานได้สำหรับฉันไม่จำเป็นต้องลบ WebDAV ตัวจัดการ (IIS 8.0)
PeterS

3
เพิ่งลบ webdav ทำงานในกรอบ 4.6.2 iis8.5
Abdul Rehman Sayed

45

อัปเดต web.config ของคุณ

  <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <add name="ExtensionlessUrl-Integrated-4.0"
           path="*."
           verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

ไม่จำเป็นต้องแก้ไขการกำหนดค่าโฮสต์ของคุณ


1
ฉันเขียนบรรทัดอื่นแล้ว แต่มันไม่ทำงาน หลังจากเพิ่มบรรทัด <remove name = "WebDAVModule" /> และ <remove name = "WebDAV" /> ทำงานอยู่ตอนนี้ ขอบคุณมาก & 1 up โหวตจากด้านข้างของฉัน
Banketeshvar Narayan

วิธีนี้ใช้งานได้ แต่อาจล้มเหลวเนื่องจากการล็อกการกำหนดค่าป้องกันการใช้ <modules> ใน web.config ในกรณีนี้คุณต้องปิดการใช้งานล็อคการกำหนดค่าใน applicationHost.config หากคุณไม่สามารถควบคุม applicationHost.config ได้ด้วยเหตุผลบางประการแสดงว่าไม่สามารถใช้วิธีการนี้ได้
ฤดูหนาว Florian

ทำงานกับ IIS10 ได้ แต่ฉันเพิ่งใช้ "*" เป็นคำกริยา
Javier G.

1
ทำงานกับ IIS 10 และ Web API 2 ทำงานฉันควรเพิ่มหลังจาก "วิธีแก้ปัญหา" อีกโหลฉันพบว่าออนไลน์ไม่ได้ ขอบคุณ!
Matt West

@ChrisMarisic: สิ่งนี้ได้ผลเช่นเดียวกับเสน่ห์สำหรับฉันขอบคุณ!
Div Tiwari

18

ใน Asp.Net Web API - webconfig สิ่งนี้ใช้ได้ในเบราว์เซอร์ทั้งหมด

เพิ่มรหัสต่อไปนี้ภายในแท็ก System.web

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

แทนที่แท็ก system.webserver ของคุณด้วยรหัสด้านล่างนี้

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>

<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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

</handlers>


ฉันมีปัญหานี้ใน IIS 7.5 และการแก้ไขนี้ทำงานได้อย่างสมบูรณ์ แทนที่จะลบเนื้อหา system.webserver ทั้งหมดของฉันฉันเพิ่งรวมการตั้งค่าที่เกี่ยวข้องด้านบนเป็นการตั้งค่าของฉันเอง
Keith Walton

38
ข้อควรระวัง : ส่วนหัวที่กำหนดเองในโค้ดข้างต้นจะช่วยให้ใด ๆเว็บไซต์ที่จะเรียก API ของคุณจากเบราว์เซอร์ - ซึ่งเป็นความเสี่ยงใหญ่ อ่านข้อมูลเพิ่มเติมเกี่ยวกับ CORS ซึ่งมีผลกับสิ่งที่ส่วนหัวเหล่านั้นเปิดใช้งาน
profMamba

ยังมีปัญหานี้ใน iis 7.5 และสิ่งนี้ใช้ได้ ต้องแน่ใจว่าได้อ่านข้อความของ Toolkit ด้านบนเกี่ยวกับความเสี่ยงที่เกี่ยวข้องกับการเปิดเครื่องให้กับทุกคน ยังยกระดับความคิดเห็นของเขาเพราะเกร็ดเล็กเกร็ดน้อยแบบนั้นมีค่ามาก
sjdirect

ฉันไม่คิดว่าคุณต้องการส่วนหัวที่กำหนดเองเลยในกรณีนี้ ส่วนที่เหลือของsystem.webserverส่วนควรเพียงพอ - เพียงตรวจสอบให้แน่ใจว่าคุณมีชื่อที่ถูกต้องสำหรับตัวจัดการ URL ส่วนขยาย
Ivaylo Slavov

1
@niico คุณควรอนุญาตให้เฉพาะไซต์ที่เชื่อถือได้ในการเข้าถึงการควบคุมการอนุญาตให้ใช้เท่านั้นเช่นแทนที่ "*" ด้วย URL เว็บไซต์ของคุณ พร็อพเพอร์ตี้นี้เป็นรายการสีขาวของไซต์ที่เชื่อถือได้ทั้งหมดยกเว้นว่าคุณต้องการที่จะเชื่อใจทั้งเว็บ (ซึ่งโดยทั่วไปจะเป็นความคิดที่ไม่ดี)
profMamba

5

สิ่งนี้ใช้ได้กับฉันใน iis8 พร้อมกับคำตอบอื่น ๆ ข้อผิดพลาดของฉันคือ 404.6 โดยเฉพาะ

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>

เมื่อคุณเรียกใช้ AppCmd ​​นี่คือสิ่งที่เกิดขึ้นในเว็บของคุณกำหนดค่า (ยกเว้นสำหรับบิต ApplyToWebDAV)
Chase Florell

5

เพียงแค่อัปเดตด่วนสำหรับใครก็ตามที่อาจพบปัญหานี้ ณ วันนี้การเปลี่ยน% userprofile% \ Documents \ iisexpress \ config \ applicationhost.config ไม่ทำงานอีกต่อไป (สิ่งนี้ทำงานได้ดีจนถึงตอนนี้ไม่แน่ใจว่านี่เป็นเพราะการปรับปรุง Windows) หลังจากชั่วโมงแห่งความยุ่งยากฉันเปลี่ยน web.config เพื่อเพิ่มตัวจัดการเหล่านี้ใน system.webserver เพื่อให้มันทำงาน:

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

4

เปิดใช้งาน CORS (ดีและเรียบร้อย)

1. เพิ่ม CORS nuget package

Install-Package microsoft.aspnet.webapi.cors

2. ในไฟล์ WebApiConfig.cs ไปที่วิธีลงทะเบียนให้เพิ่มรหัสต่อไปนี้:

config.EnableCors();

เช่น
ใช้ System.Web.Http;

namespace test
{
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services


        config.EnableCors(); //add this**************************


        // Web API routes
        config.MapHttpAttributeRoutes();

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

3. เพิ่มรหัสตะโกนลงในเนมสเปซของคอนโทรลเลอร์ประกอบด้วย get, post, delete, put หรือ http ใด ๆ

[EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")]

อดีต:

using System.Web.Http.Cors;//add this******************************
namespace Test.Controllers
{
[EnableCors(origins: "http://localhost:53681/HTML/Restaurant.html", headers: "*", methods: "*")]
public class RestaurantController : ApiController
{
    protected TestBusinessLayer DevTestBLL = new TestBusinessLayer();

    public List<Restaurant> GET()
    {
        return DevTestBLL.GetRestaurant();
    }

    public List<Restaurant> DELETE(int id)
    {
        return DevTestBLL.DeleteRestaurant(id);
    }       
}
}

การอ้างอิง: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api


4

หลังจากไม่มีอะไรทำงานฉันสามารถแก้ไขปัญหานี้ได้โดยทำตามขั้นตอนด้านล่าง:

•ไม่ได้เลือกการตั้งค่า IIS 'WEB DAV PUBLISHING' ขณะติดตั้ง IIS • INETMGR - เว็บไซต์เริ่มต้น - การกรองคำขอ - คำกริยา HTTP - PUT เป็น True


3

หลังจากค้นหาและลองคำตอบที่ไม่รู้จบแล้ว (เพิ่ม PUT ลบคำกริยาและลบ WEBdav) มันก็ไม่ได้ผล

ฉันไปที่การตั้งค่าการบันทึก IIS:> ดูไฟล์บันทึก ในกรณีของฉัน W3SVC4 เป็นโฟลเดอร์ที่มีวันที่ล่าสุดเปิดโฟลเดอร์ค้นหาไฟล์บันทึกล่าสุดและเห็นรายการนี้: GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

วิธีการอัปเดตมีการระบุไว้ด้วยกริยา GET ใช่ไหม? ดังนั้นผมจึง Googled สำหรับปฏิเสธ-By-UrlScan และพบลิงค์นี้: UrlScan Broke บล็อกของฉัน

ฉันไปที่นี่:% windir% \ system32 \ inetsrv \ urlscan \ UrlScan.ini

โดยพื้นฐานแล้ว UrlScan บล็อกคำกริยา PUT และ DELETE ฉันเปิดไฟล์ INI นี้เพิ่ม PUT และ DELETE ไปยัง AllowVerbs และลบออกจากรายการ DenyVerbs ฉันบันทึกไฟล์ INI และใช้งานได้! ดังนั้นสำหรับฉันขั้นตอนเหล่านี้มีความจำเป็นถัดจากคำแนะนำ ExtensionlessUrlHandler

Windows Webserver 2008 R2 (64 บิต), IIS 7.5 ฉันใช้สิ่งนี้ร่วมกับ DotNetNuke (DNN) WebAPI ASP.Net 4.0 วิธีการอัพเดตของฉัน:

[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)

3

สำหรับ PHP มันเป็นเพียง:

  1. เปิด IIS
  2. ไปที่การแมปตัวจัดการ
  3. คลิกแก้ไขบน php5.6.x หรือ php7.0.x
  4. คลิก "ข้อ จำกัด คำขอ"
  5. ภายใต้แท็บคำกริยาเลือก "หนึ่งในคำกริยาต่อไปนี้" และเพิ่ม "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS"

ฉันคิดว่ามันจะทำงานกับตัวจัดการอื่น ๆ ด้วย


2

นอกจากวิธีข้างต้นทั้งหมดให้ตรวจสอบว่าคุณมี " id " หรือพารามิเตอร์ที่กำหนดเองใด ๆ ในเมธอด DELETE กำลังจับคู่การกำหนดเส้นทาง

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

หากคุณพบกับข้อผิดพลาด 405 ซ้ำให้รีเซ็ตวิธีการตั้งค่าเป็นค่าเริ่มต้นตามด้านบนแล้วลอง

การกำหนดเส้นทางตามค่าเริ่มต้นจะมองหาidใน URL ดังนั้นชื่อรหัสพารามิเตอร์จึงมีความสำคัญที่นี่เว้นแต่คุณจะเปลี่ยนการกำหนดเส้นทางในโฟลเดอร์App_Start

คุณสามารถเปลี่ยนชนิดข้อมูลของidได้

ตัวอย่างเช่นวิธีการด้านล่างควรใช้งานได้:

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

หมายเหตุ: ตรวจสอบให้แน่ใจด้วยว่าคุณส่งข้อมูลผ่าน url ไม่ใช่วิธีข้อมูลที่จะนำเพย์โหลดเป็นเนื้อหาเนื้อหา

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

ตัวอย่าง:

DELETE http://localhost/item/1

หวังว่ามันจะช่วย


2

ฉันประสบปัญหาเดียวกันกับคุณจากนั้นแก้ไขมันนี่คือวิธีแก้ปัญหาฉันหวังว่ามันจะช่วยได้
ก่อน

ในการmodulesกำหนดค่าIIS ให้วนลูปWebDAVModuleถ้าเว็บเซิร์ฟเวอร์ของคุณมีอยู่ให้ลบออก

ที่สอง

ในการhandler mappingsกำหนดค่าIIS คุณสามารถดูรายการการเปิดใช้งานตัวจัดการเพื่อเลือกthe PHP itemแก้ไขบนหน้าแก้ไขคลิกปุ่ม จำกัด การร้องขอจากนั้นเลือกthe verbs tabใน modal ในการระบุคำกริยาที่จะจัดการฉลากตรวจสอบall verbs radioแล้ว คลิกตกลงคุณอาจเห็นคำเตือนแสดงว่าเราใช้เครื่องหมายอัญประกาศคู่กับการเรียกใช้งาน PHP-CGI จากนั้นทำ

ถ้าเสร็จแล้วรีสตาร์ทเซิร์ฟเวอร์ IIS ก็จะโอเค

ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันลบ WebDAVModule ออกจากเว็บไซต์ IIS เท่านั้นและนั่นเหมาะกับฉัน
Umair Malhi

1

ฉันไม่แน่ใจว่าคุณแก้ไขไฟล์การตั้งค่าที่ถูกต้องหรือไม่ ลองทำตามขั้นตอน

  1. เปิด% userprofile% \ ducuments \ iisexpress \ config \ applicationhost.config

  2. โดยค่าเริ่มต้นร้องให้รายการที่มีการแสดงความคิดเห็นในไฟล์ applicationhost.config ยกเลิกการคอมเมนต์รายการเหล่านี้

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />


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

4
ล้อเล่นกับ applicationhost.config? nope
ชุดเครื่องมือ

ไม่ควรยุ่งกับไฟล์อื่นนอกเหนือจากไฟล์กำหนดค่าแอปพลิเคชัน อันดับแรก - คุณจะทำสิ่งนี้กับเซิร์ฟเวอร์ทั้งหมดและลืมไปแล้วหลายคนจะสงสัยว่ามันทำงานกับเครื่องนี้ได้อย่างไรและไม่ทำงานในส่วนที่เหลือ นอกจากนี้หากคุณไม่ได้รับอนุญาตให้เข้าถึงไฟล์ IIS config บนเซิร์ฟเวอร์ที่โฮสต์แอปพลิเคชันคุณจะต้องทำงานใน web.config ลองนึกภาพเซิร์ฟเวอร์ dev ของคุณมีการอัปเดตข้างต้น web.config ของคุณจะถูกต้องหรือไม่ มันเป็นวิธีที่ดีในการคลายวันของใครบางคนในการตรวจสอบว่าทำไมการปรับใช้การผลิตจึงล้มเหลว
Ivaylo Slavov

1

นี่คือวิธีที่คุณอนุญาตกริยา HTTP พิเศษโดยใช้ IIS Manager GUI

  1. ใน IIS Manager ให้เลือกไซต์ที่คุณต้องการอนุญาต PUT หรือ DELETE

  2. คลิกตัวเลือก "การกรองคำขอ" คลิกแท็บ "คำกริยา HTTP"

  3. คลิกลิงก์ "อนุญาตคำกริยา ... " ในแถบด้านข้าง

  4. ในกล่องที่ปรากฏพิมพ์ "DELETE" คลิกตกลง

  5. คลิกลิงก์ "อนุญาตคำกริยา ... " ในแถบด้านข้างอีกครั้ง

  6. ในกล่องที่ปรากฏพิมพ์ "PUT" คลิกตกลง


ลองดี - สิ่งที่แตกต่างสำหรับครั้งเดียว - แต่ก็ยังไม่ทำงาน!
ozzy432836

ฉันลองทุกอย่างที่ฉันเคยเห็นที่แนะนำใน SO และที่อื่น ๆ ในที่สุดฉันก็ลองมันและมันก็ทำงานได้อย่างสมบูรณ์ ในกรณีของฉันกริยา PUT และ DELETE อยู่ในรายการอยู่แล้วและฉันต้องลบมันออกก่อนแล้วจึงเพิ่มกลับเข้าไปโดยใช้ลิงก์อนุญาตคำกริยา ... แต่ก็ยังทำงานได้เมื่อไม่มีสิ่งอื่น ขอบคุณมาก!
JTennessen

1

ฉันกำลังใช้ไฟล์ Ashx ในแอปพลิเคชั่น MVC และไม่มีคำตอบใดที่ได้ผลสำหรับฉัน IIS 10

นี่คือสิ่งที่ทำงาน แทนที่จะเปลี่ยน " ExtensionlessUrl-Integrated-4.0 " ใน IIS หรือ web.config ฉันเปลี่ยน " SimpleHandlerFactory-Integrated-4.0 " สำหรับไฟล์" * .ashx ":

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" 
verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
type="System.Web.UI.SimpleHandlerFactory" 
resourceType="Unspecified" requireAccess="Script" 
preCondition="integratedMode,runtimeVersionv4.0" />

0

อีกเหตุผลหนึ่งอาจเป็นดังต่อไปนี้:
ฉันเปลี่ยนวิธี Url สำหรับ Web Api ตามคำตอบนี้ :

Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })

แต่วิธีนี้จะสร้างลิงค์เช่น:

/api/MyApiCtrl?action=MyAction

สิ่งนี้ทำงานได้อย่างถูกต้องกับคำขอ GET และ POST แต่ไม่ใช่กับ PUT หรือ DELETE
ดังนั้นฉันเพิ่งแทนที่ด้วย:

/api/MyApiCtrl

และแก้ไขปัญหาได้


0

ใน IIS 8.5 / Windows 2012R2 ไม่มีอะไรพูดถึงที่นี่ทำงานได้สำหรับฉัน ฉันไม่ทราบว่าสิ่งที่มีความหมายโดยการลบ WebDAV แต่นั่นไม่ได้แก้ปัญหาสำหรับฉัน

สิ่งที่ช่วยฉันได้คือขั้นตอนด้านล่าง

  1. ฉันไปที่ผู้จัดการ IIS
  2. ในแผงด้านซ้ายเลือกไซต์
  3. ในพื้นที่ใช้งานด้านซ้ายให้เลือก WebDAV แล้วเปิดขึ้นมาดับเบิลคลิก
  4. ในแผงด้านขวาส่วนใหญ่ปิดการใช้งาน

ตอนนี้ทุกอย่างทำงาน


-1

คุณสามารถแปลงวิธีการลบของคุณเป็น POST เป็น;

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.